diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1cf75d8afc..182fa16dfc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,7 +31,7 @@ jobs: experimental: false continue-on-error: ${{ matrix.experimental }} steps: - - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: submodules: recursive - uses: subosito/flutter-action@44ac965b96f18d999802d4b807e3256d5a3f9fa1 @@ -55,7 +55,7 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'cfug/flutter.cn' steps: - - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: submodules: recursive - uses: dart-lang/setup-dart@0a8a0fc875eb934c15d08629302413c671d3f672 @@ -73,12 +73,12 @@ jobs: if: | github.repository == 'cfug/flutter.cn' steps: - - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: submodules: recursive - name: Enable Corepack run: corepack enable - - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 + - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af with: node-version: ${{ env.NODE_VERSION }} cache: 'pnpm' @@ -106,7 +106,7 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'cfug/flutter.cn' steps: - - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: submodules: recursive - uses: dart-lang/setup-dart@0a8a0fc875eb934c15d08629302413c671d3f672 @@ -126,14 +126,14 @@ jobs: github.ref == 'refs/heads/main' && github.repository == 'cfug/flutter.cn' steps: - - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: submodules: recursive # docs.flutter.cn | https://github.com/cfug/flutter.cn/pull/1518 fetch-depth: 0 - name: Enable Corepack run: corepack enable - - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 + - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af with: node-version: ${{ env.NODE_VERSION }} cache: 'pnpm' diff --git a/.github/workflows/stage.yml b/.github/workflows/stage.yml index 89bc03eca6..c18b784247 100644 --- a/.github/workflows/stage.yml +++ b/.github/workflows/stage.yml @@ -20,14 +20,14 @@ jobs: runs-on: ubuntu-latest if: ${{ github.event.pull_request.head.repo.full_name == 'cfug/flutter.cn' }} steps: - - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 with: submodules: recursive # docs.flutter.cn | https://github.com/cfug/flutter.cn/pull/1518 fetch-depth: 0 - name: Enable Corepack run: corepack enable - - uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 + - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af with: node-version: ${{ env.NODE_VERSION }} cache: 'pnpm' diff --git a/.gitignore b/.gitignore index e8c8e1c67d..6fe5ae66c7 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,6 @@ node_modules package-lock.json pubspec.lock tmp/ + +# Temporary as codelabs used to be a submodule +examples/codelabs diff --git a/.gitmodules b/.gitmodules index 0aac8b8cc9..e870af4f0e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,6 +2,3 @@ path = site-shared url = https://github.com/dart-lang/site-shared branch = main -[submodule "examples/codelabs"] - path = examples/codelabs - url = https://github.com/flutter/codelabs diff --git a/analysis_options.yaml b/analysis_options.yaml index 8387f452a3..93582dfeb5 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,2 +1,2 @@ analyzer: - exclude: [flutter, site-shared, src, tmp, 'examples/codelabs'] + exclude: [flutter, site-shared, src, tmp] diff --git a/eleventy.config.js b/eleventy.config.js index 138ed8358b..195f369098 100644 --- a/eleventy.config.js +++ b/eleventy.config.js @@ -78,7 +78,7 @@ export default function (eleventyConfig) { eleventyConfig.addPassthroughCopy('src/content/assets/js'); // inject_dartpad 暂时放置在本地 tool/inject_dartpad/ - // eleventyConfig.addPassthroughCopy({'site-shared/packages/inject_dartpad/lib/inject_dartpad.js': 'assets/js/inject_dartpad.js'}); + // eleventyConfig.addPassthroughCopy({'site-shared/pkgs/inject_dartpad/lib/inject_dartpad.js': 'assets/js/inject_dartpad.js'}); eleventyConfig.addPassthroughCopy('src/content/assets/images', { expand: true }); // docs.flutter.cn - translator eleventyConfig.addPassthroughCopy('src/content/assets/translator'); diff --git a/examples/basics/analysis_options.yaml b/examples/accessibility/analysis_options.yaml similarity index 100% rename from examples/basics/analysis_options.yaml rename to examples/accessibility/analysis_options.yaml diff --git a/examples/accessibility/lib/main.dart b/examples/accessibility/lib/main.dart new file mode 100644 index 0000000000..f4aa07e146 --- /dev/null +++ b/examples/accessibility/lib/main.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +void main() => runApp(const AccessibleApp()); + +class AccessibleApp extends StatelessWidget { + const AccessibleApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Your accessible app', + home: Scaffold( + appBar: AppBar( + title: const Text('Your accessible app'), + ), + ), + ); + } +} diff --git a/examples/basics/pubspec.yaml b/examples/accessibility/pubspec.yaml similarity index 64% rename from examples/basics/pubspec.yaml rename to examples/accessibility/pubspec.yaml index 2ba0958b9b..14d7e77a2c 100644 --- a/examples/basics/pubspec.yaml +++ b/examples/accessibility/pubspec.yaml @@ -1,6 +1,7 @@ -name: null_safety_basics -description: Some code to demonstrate null safety. +name: your_accessible_app +description: A Flutter project to contain accessibility-related code excerpts. version: 1.0.0 +publish_to: none environment: sdk: ^3.5.0 diff --git a/examples/accessibility/test/a11y_test.dart b/examples/accessibility/test/a11y_test.dart new file mode 100644 index 0000000000..558c9d04f3 --- /dev/null +++ b/examples/accessibility/test/a11y_test.dart @@ -0,0 +1,26 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:your_accessible_app/main.dart'; + +void main() { + testWidgets('Follows a11y guidelines', (tester) async { + final SemanticsHandle handle = tester.ensureSemantics(); + await tester.pumpWidget(const AccessibleApp()); + + // Checks that tappable nodes have a minimum size of 48 by 48 pixels + // for Android. + await expectLater(tester, meetsGuideline(androidTapTargetGuideline)); + + // Checks that tappable nodes have a minimum size of 44 by 44 pixels + // for iOS. + await expectLater(tester, meetsGuideline(iOSTapTargetGuideline)); + + // Checks that touch targets with a tap or long press action are labeled. + await expectLater(tester, meetsGuideline(labeledTapTargetGuideline)); + + // Checks whether semantic nodes meet the minimum text contrast levels. + // The recommended text contrast is 3:1 for larger text + // (18 point and above regular). + await expectLater(tester, meetsGuideline(textContrastGuideline)); + handle.dispose(); + }); +} diff --git a/examples/basics/lib/main.dart b/examples/basics/lib/main.dart deleted file mode 100644 index 87c91bcd5d..0000000000 --- a/examples/basics/lib/main.dart +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2021 The Flutter team. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// ignore_for_file: avoid_init_to_null - -import 'package:flutter/material.dart'; - -void main() => runApp(const MyApp()); - -// #docregion my-app -class MyApp extends StatelessWidget { - const MyApp({super.key}); - - final int anInt = 3; // Can't be null. - final int? aNullableInt = null; // Can be null. - - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Nullable Fields Demo', - home: Scaffold( - appBar: AppBar( - title: const Text('Nullable Fields Demo'), - ), - body: Center( - child: Column( - children: [ - Text('anInt is $anInt.'), - Text('aNullableInt is $aNullableInt.'), - ], - ), - ), - ), - ); - } -} -// #enddocregion my-app diff --git a/examples/codelabs b/examples/codelabs deleted file mode 160000 index ad31963f03..0000000000 --- a/examples/codelabs +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ad31963f0396c7890032c25de72ac7711616a949 diff --git a/examples/cookbook/animation/page_route_animation/lib/starter.dart b/examples/cookbook/animation/page_route_animation/lib/starter.dart index 0f6fcd8b15..d248a9d533 100644 --- a/examples/cookbook/animation/page_route_animation/lib/starter.dart +++ b/examples/cookbook/animation/page_route_animation/lib/starter.dart @@ -87,10 +87,12 @@ Route step2() { ); } -// #docregion step3 -var curve = Curves.ease; -var curveTween = CurveTween(curve: curve); -// #enddocregion step3 +void createCurves() { + // #docregion step3 + var curve = Curves.ease; + var curveTween = CurveTween(curve: curve); + // #enddocregion step3 +} Route step4() { return PageRouteBuilder( diff --git a/examples/cookbook/effects/nested_nav/lib/add_navigator.dart b/examples/cookbook/effects/nested_nav/lib/add_navigator.dart index 1d0050c988..fefeb755d0 100644 --- a/examples/cookbook/effects/nested_nav/lib/add_navigator.dart +++ b/examples/cookbook/effects/nested_nav/lib/add_navigator.dart @@ -25,7 +25,7 @@ void main() { ), // #docregion OnGenerateRoute onGenerateRoute: (settings) { - late Widget page; + final Widget page; if (settings.name == routeHome) { page = const HomeScreen(); } else if (settings.name == routeSettings) { @@ -71,7 +71,7 @@ class SetupFlow extends StatefulWidget { } class SetupFlowState extends State { -// #docregion AddNavigator + // #docregion AddNavigator final _navigatorKey = GlobalKey(); void _onDiscoveryComplete() { @@ -134,7 +134,7 @@ class SetupFlowState extends State { settings: settings, ); } -// #enddocregion AddNavigator + // #enddocregion AddNavigator @override void initState() { @@ -304,56 +304,58 @@ class FinishedPage extends StatelessWidget { body: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 24), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 250, - height: 250, - decoration: const BoxDecoration( - shape: BoxShape.circle, - color: Color(0xFF222222), - ), - child: const Center( - child: Icon( - Icons.lightbulb, - size: 175, - color: Colors.white, + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 200, + height: 200, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Color(0xFF222222), + ), + child: const Center( + child: Icon( + Icons.lightbulb, + size: 140, + color: Colors.white, + ), ), ), - ), - const SizedBox(height: 32), - const Text( - 'Bulb added!', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 32), - ElevatedButton( - style: ButtonStyle( - padding: WidgetStateProperty.resolveWith((states) { - return const EdgeInsets.symmetric( - horizontal: 24, vertical: 12); - }), - backgroundColor: WidgetStateColor.resolveWith((states) { - return const Color(0xFF222222); - }), - shape: WidgetStateProperty.resolveWith((states) { - return const StadiumBorder(); - }), - ), - onPressed: onFinishPressed, - child: const Text( - 'Finish', + const SizedBox(height: 32), + const Text( + 'Bulb added!', + textAlign: TextAlign.center, style: TextStyle( fontSize: 24, + fontWeight: FontWeight.bold, ), ), - ), - ], + const SizedBox(height: 32), + ElevatedButton( + style: ButtonStyle( + padding: WidgetStateProperty.resolveWith((states) { + return const EdgeInsets.symmetric( + horizontal: 24, vertical: 12); + }), + backgroundColor: WidgetStateColor.resolveWith((states) { + return const Color(0xFF222222); + }), + shape: WidgetStateProperty.resolveWith((states) { + return const StadiumBorder(); + }), + ), + onPressed: onFinishPressed, + child: const Text( + 'Finish', + style: TextStyle( + fontSize: 24, + ), + ), + ), + ], + ), ), ), ), @@ -378,8 +380,8 @@ class HomeScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Container( - width: 250, - height: 250, + width: 200, + height: 200, decoration: const BoxDecoration( shape: BoxShape.circle, color: Color(0xFF222222), @@ -387,7 +389,7 @@ class HomeScreen extends StatelessWidget { child: Center( child: Icon( Icons.lightbulb, - size: 175, + size: 140, color: Theme.of(context).scaffoldBackgroundColor, ), ), diff --git a/examples/cookbook/effects/nested_nav/lib/main.dart b/examples/cookbook/effects/nested_nav/lib/main.dart index ecde40aa55..c7c26cfc8d 100644 --- a/examples/cookbook/effects/nested_nav/lib/main.dart +++ b/examples/cookbook/effects/nested_nav/lib/main.dart @@ -25,7 +25,7 @@ void main() { ), // #docregion OnGenerateRoute onGenerateRoute: (settings) { - late Widget page; + final Widget page; if (settings.name == routeHome) { page = const HomeScreen(); } else if (settings.name == routeSettings) { @@ -302,56 +302,58 @@ class FinishedPage extends StatelessWidget { body: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 24), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 250, - height: 250, - decoration: const BoxDecoration( - shape: BoxShape.circle, - color: Color(0xFF222222), - ), - child: const Center( - child: Icon( - Icons.lightbulb, - size: 175, - color: Colors.white, + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 200, + height: 200, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Color(0xFF222222), + ), + child: const Center( + child: Icon( + Icons.lightbulb, + size: 140, + color: Colors.white, + ), ), ), - ), - const SizedBox(height: 32), - const Text( - 'Bulb added!', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 32), - ElevatedButton( - style: ButtonStyle( - padding: WidgetStateProperty.resolveWith((states) { - return const EdgeInsets.symmetric( - horizontal: 24, vertical: 12); - }), - backgroundColor: WidgetStateColor.resolveWith((states) { - return const Color(0xFF222222); - }), - shape: WidgetStateProperty.resolveWith((states) { - return const StadiumBorder(); - }), - ), - onPressed: onFinishPressed, - child: const Text( - 'Finish', + const SizedBox(height: 32), + const Text( + 'Bulb added!', + textAlign: TextAlign.center, style: TextStyle( fontSize: 24, + fontWeight: FontWeight.bold, ), ), - ), - ], + const SizedBox(height: 32), + ElevatedButton( + style: ButtonStyle( + padding: WidgetStateProperty.resolveWith((states) { + return const EdgeInsets.symmetric( + horizontal: 24, vertical: 12); + }), + backgroundColor: WidgetStateColor.resolveWith((states) { + return const Color(0xFF222222); + }), + shape: WidgetStateProperty.resolveWith((states) { + return const StadiumBorder(); + }), + ), + onPressed: onFinishPressed, + child: const Text( + 'Finish', + style: TextStyle( + fontSize: 24, + ), + ), + ), + ], + ), ), ), ), @@ -376,8 +378,8 @@ class HomeScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Container( - width: 250, - height: 250, + width: 200, + height: 200, decoration: const BoxDecoration( shape: BoxShape.circle, color: Color(0xFF222222), @@ -385,7 +387,7 @@ class HomeScreen extends StatelessWidget { child: Center( child: Icon( Icons.lightbulb, - size: 175, + size: 140, color: Theme.of(context).scaffoldBackgroundColor, ), ), diff --git a/examples/cookbook/effects/nested_nav/lib/original_example.dart b/examples/cookbook/effects/nested_nav/lib/original_example.dart index af687de725..7ed5307003 100644 --- a/examples/cookbook/effects/nested_nav/lib/original_example.dart +++ b/examples/cookbook/effects/nested_nav/lib/original_example.dart @@ -22,7 +22,7 @@ void main() { ), ), onGenerateRoute: (settings) { - late Widget page; + final Widget page; if (settings.name == routeHome) { page = const HomeScreen(); } else if (settings.name == routeSettings) { @@ -298,56 +298,58 @@ class FinishedPage extends StatelessWidget { body: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 24), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 250, - height: 250, - decoration: const BoxDecoration( - shape: BoxShape.circle, - color: Color(0xFF222222), - ), - child: const Center( - child: Icon( - Icons.lightbulb, - size: 175, - color: Colors.white, + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 200, + height: 200, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Color(0xFF222222), + ), + child: const Center( + child: Icon( + Icons.lightbulb, + size: 140, + color: Colors.white, + ), ), ), - ), - const SizedBox(height: 32), - const Text( - 'Bulb added!', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 32), - ElevatedButton( - style: ButtonStyle( - padding: WidgetStateProperty.resolveWith((states) { - return const EdgeInsets.symmetric( - horizontal: 24, vertical: 12); - }), - backgroundColor: WidgetStateColor.resolveWith((states) { - return const Color(0xFF222222); - }), - shape: WidgetStateProperty.resolveWith((states) { - return const StadiumBorder(); - }), - ), - onPressed: onFinishPressed, - child: const Text( - 'Finish', + const SizedBox(height: 32), + const Text( + 'Bulb added!', + textAlign: TextAlign.center, style: TextStyle( fontSize: 24, + fontWeight: FontWeight.bold, ), ), - ), - ], + const SizedBox(height: 32), + ElevatedButton( + style: ButtonStyle( + padding: WidgetStateProperty.resolveWith((states) { + return const EdgeInsets.symmetric( + horizontal: 24, vertical: 12); + }), + backgroundColor: WidgetStateColor.resolveWith((states) { + return const Color(0xFF222222); + }), + shape: WidgetStateProperty.resolveWith((states) { + return const StadiumBorder(); + }), + ), + onPressed: onFinishPressed, + child: const Text( + 'Finish', + style: TextStyle( + fontSize: 24, + ), + ), + ), + ], + ), ), ), ), @@ -372,8 +374,8 @@ class HomeScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Container( - width: 250, - height: 250, + width: 200, + height: 200, decoration: const BoxDecoration( shape: BoxShape.circle, color: Color(0xFF222222), @@ -381,7 +383,7 @@ class HomeScreen extends StatelessWidget { child: Center( child: Icon( Icons.lightbulb, - size: 175, + size: 140, color: Theme.of(context).scaffoldBackgroundColor, ), ), diff --git a/examples/cookbook/games/firestore_multiplayer/lib/firebase_options.dart b/examples/cookbook/games/firestore_multiplayer/lib/firebase_options.dart index 96577dfd3e..d58f45fa7b 100644 --- a/examples/cookbook/games/firestore_multiplayer/lib/firebase_options.dart +++ b/examples/cookbook/games/firestore_multiplayer/lib/firebase_options.dart @@ -2,7 +2,7 @@ // ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; import 'package:flutter/foundation.dart' - show defaultTargetPlatform, kIsWeb, TargetPlatform; + show TargetPlatform, defaultTargetPlatform, kIsWeb; /// Default [FirebaseOptions] for use with your Firebase apps. /// diff --git a/examples/example_utils/lib/analysis.yaml b/examples/example_utils/lib/analysis.yaml index 4fa993bf47..83d187425e 100644 --- a/examples/example_utils/lib/analysis.yaml +++ b/examples/example_utils/lib/analysis.yaml @@ -12,23 +12,27 @@ linter: - avoid_types_on_closure_parameters - avoid_void_async - cancel_subscriptions - - comment_references - close_sinks + - combinators_ordering + - comment_references - directives_ordering - invalid_case_patterns - - library_annotations - matching_super_parameters - no_self_assignments - no_wildcard_variable_uses - one_member_abstracts - - package_api_docs + - only_throw_errors + - prefer_const_constructors + - prefer_const_declarations + - prefer_const_literals_to_create_immutables - prefer_relative_imports - prefer_single_quotes - - only_throw_errors - sort_unnamed_constructors_first - test_types_in_equals - throw_in_finally + - type_annotate_public_apis - unawaited_futures - unnecessary_breaks - unnecessary_library_directive - unnecessary_statements + - use_is_even_rather_than_modulo diff --git a/examples/get-started/codelab_web/lib/main.dart b/examples/get-started/codelab_web/lib/main.dart index 0dacd381fc..4a75c605c5 100644 --- a/examples/get-started/codelab_web/lib/main.dart +++ b/examples/get-started/codelab_web/lib/main.dart @@ -188,7 +188,7 @@ class _AnimatedProgressIndicatorState extends State } @override - void didUpdateWidget(oldWidget) { + void didUpdateWidget(AnimatedProgressIndicator oldWidget) { super.didUpdateWidget(oldWidget); _controller.animateTo(widget.value); } diff --git a/examples/get-started/codelab_web/lib/step3.dart b/examples/get-started/codelab_web/lib/step3.dart index 3f5a71da61..d22358040f 100644 --- a/examples/get-started/codelab_web/lib/step3.dart +++ b/examples/get-started/codelab_web/lib/step3.dart @@ -192,7 +192,7 @@ class _AnimatedProgressIndicatorState extends State } @override - void didUpdateWidget(oldWidget) { + void didUpdateWidget(AnimatedProgressIndicator oldWidget) { super.didUpdateWidget(oldWidget); _controller.animateTo(widget.value); } diff --git a/examples/get-started/flutter-for/android_devs/lib/isolates.dart b/examples/get-started/flutter-for/android_devs/lib/isolates.dart index 2a13297fec..440cb84ab7 100644 --- a/examples/get-started/flutter-for/android_devs/lib/isolates.dart +++ b/examples/get-started/flutter-for/android_devs/lib/isolates.dart @@ -87,10 +87,10 @@ class _SampleAppPageState extends State { // The 'echo' isolate sends its SendPort as the first message. SendPort sendPort = await receivePort.first; - List msg = await sendReceive( + final msg = await sendReceive( sendPort, 'https://jsonplaceholder.typicode.com/posts', - ); + ) as List; setState(() { widgets = msg; @@ -116,7 +116,7 @@ class _SampleAppPageState extends State { } } - Future sendReceive(SendPort port, msg) { + Future sendReceive(SendPort port, Object? msg) { ReceivePort response = ReceivePort(); port.send([msg, response.sendPort]); return response.first; diff --git a/examples/get-started/flutter-for/ios_devs/lib/list.dart b/examples/get-started/flutter-for/ios_devs/lib/list.dart index 09e30cbaab..c2c3edf2d3 100644 --- a/examples/get-started/flutter-for/ios_devs/lib/list.dart +++ b/examples/get-started/flutter-for/ios_devs/lib/list.dart @@ -26,7 +26,7 @@ class Person { Person(this.name); } -var items = [ +final List items = [ Person('Person 1'), Person('Person 2'), Person('Person 3'), diff --git a/examples/platform_integration/ffi/analysis_options.yaml b/examples/platform_integration/compose_activities/analysis_options.yaml similarity index 100% rename from examples/platform_integration/ffi/analysis_options.yaml rename to examples/platform_integration/compose_activities/analysis_options.yaml diff --git a/examples/platform_integration/compose_activities/lib/launch_compose_activity_example_1.dart b/examples/platform_integration/compose_activities/lib/launch_compose_activity_example_1.dart new file mode 100644 index 0000000000..94af881788 --- /dev/null +++ b/examples/platform_integration/compose_activities/lib/launch_compose_activity_example_1.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +// SECTION 1: START COPYING HERE +const platformMethodChannel = MethodChannel( + // Note: You can change this string value, but it must match + // the `CHANNEL` attribute in the next step. + 'com.example.flutter_android_activity', +); +// SECTION 1: END COPYING HERE + +void main() { + runApp(const MainApp()); +} + +class MainApp extends StatelessWidget { + const MainApp({super.key}); + + // SECTION 2: START COPYING HERE + void _launchAndroidActivity() { + platformMethodChannel.invokeMethod( + // Note: You can change this value, but it must match + // the `call.method` value in the next section. + 'launchActivity', + + // Note: You can pass any primitive data types you like. + // To pass complex types, use package:pigeon to generate + // matching Dart and Kotlin classes that share serialization logic. + {'message': 'Hello from Flutter'}, + ); + } + // SECTION 2: END COPYING HERE + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + body: const Center( + child: Text('Hello World!'), + ), + floatingActionButton: FloatingActionButton( + // SECTION 3: Call `_launchAndroidActivity` somewhere. + onPressed: _launchAndroidActivity, + // SECTION 3: End + + tooltip: 'Launch Android activity', + child: const Icon(Icons.launch), + ), + ), + ); + } +} diff --git a/examples/platform_integration/ffi/pubspec.yaml b/examples/platform_integration/compose_activities/pubspec.yaml similarity index 66% rename from examples/platform_integration/ffi/pubspec.yaml rename to examples/platform_integration/compose_activities/pubspec.yaml index d356107462..a764cee8e4 100644 --- a/examples/platform_integration/ffi/pubspec.yaml +++ b/examples/platform_integration/compose_activities/pubspec.yaml @@ -1,6 +1,5 @@ -name: ffi_examples -description: >- - Examples showcasing how to use Dart's FFI support for platform integration. +name: flutter_android_activity +description: Examples showcasing Flutter's support for launching native Android activities. publish_to: none @@ -14,10 +13,10 @@ dependencies: sdk: flutter dev_dependencies: - example_utils: - path: ../../example_utils flutter_test: sdk: flutter + example_utils: + path: ../../example_utils flutter: uses-material-design: true diff --git a/examples/platform_integration/ffi/lib/c_interop.dart b/examples/platform_integration/ffi/lib/c_interop.dart deleted file mode 100644 index 32110162f8..0000000000 --- a/examples/platform_integration/ffi/lib/c_interop.dart +++ /dev/null @@ -1,14 +0,0 @@ -// #docregion dynamic-library -import 'dart:ffi'; // For FFI -import 'dart:io'; // For Platform.isX - -final DynamicLibrary nativeAddLib = Platform.isAndroid - ? DynamicLibrary.open('libnative_add.so') - : DynamicLibrary.process(); -// #enddocregion dynamic-library - -// #docregion search -final int Function(int x, int y) nativeAdd = nativeAddLib - .lookup>('native_add') - .asFunction(); -// #enddocregion native-add diff --git a/examples/ui/adaptive_app_demos/lib/pages/adaptive_data_table_page.dart b/examples/ui/adaptive_app_demos/lib/pages/adaptive_data_table_page.dart index 15478565d9..8df0c33d8e 100644 --- a/examples/ui/adaptive_app_demos/lib/pages/adaptive_data_table_page.dart +++ b/examples/ui/adaptive_app_demos/lib/pages/adaptive_data_table_page.dart @@ -29,7 +29,7 @@ class AdaptiveDataTablePage extends StatelessWidget { child: Column( children: items.map((i) { return Container( - color: i % 2 == 0 ? Colors.grey.shade300 : null, + color: i.isEven ? Colors.grey.shade300 : null, child: Row( children: [ _TableRowItem('Item $i, Column 1'), diff --git a/firebase.json b/firebase.json index edc04d933a..81f9483665 100644 --- a/firebase.json +++ b/firebase.json @@ -165,7 +165,7 @@ { "source": "/tools/devtools/codeSize", "destination": "/tools/devtools/app-size", "type": 301 }, { "source": "/tools/devtools/overview", "destination": "/tools/devtools", "type": 301 }, { "source": "/tools/devtools/timeline", "destination": "/tools/devtools/performance", "type": 301 }, - { "source": "/tools/ide", "destination": "/tools/android-studio", "type": 301 }, + { "source": "/tools/ide", "destination": "/tools/vs-code", "type": 301 }, { "source": "/tools/ide/android-studio", "destination": "/tools/android-studio", "type": 301 }, { "source": "/tools/ide/vs-code", "destination": "/tools/vs-code", "type": 301 }, { "source": "/tools/inspector", "destination": "/tools/devtools/inspector", "type": 301 }, @@ -218,7 +218,7 @@ { "source": "/clock", "destination": "https://medium.com/flutter/its-time-the-flutter-clock-contest-results-dcebe2eb3957", "type": 301 }, { "source": "/create", "destination": "https://medium.com/flutter/the-flutter-create-winners-are-40980f2d20b3", "type": 301 }, { "source": "/assets/images/docs/intellij/hot-reload.gif", "destination": "https://raw.githubusercontent.com/flutter/website/main/src/assets/images/docs/tools/android-studio/hot-reload.gif", "type": 301 }, - { "source": "/brick-breaker", "destination": "https://codelabs.developers.google.com/codelabs/flutter-flame-brick-breaker", "type": 301 }, + { "source": "/brick-breaker", "destination": "https://codelabs.developers.google.cn/codelabs/flutter-flame-brick-breaker", "type": 301 }, { "source": "/catalog/samples", "destination": "https://flutter.github.io/samples/#", "type": 301 }, { "source": "/catalog/samples/*", "destination": "https://flutter.github.io/samples/#", "type": 301 }, { "source": "/chat", "destination": "https://github.com/flutter/flutter/blob/master/docs/contributing/Chat.md", "type": 302 }, @@ -226,7 +226,7 @@ { "source": "/deferred-components-wiki", "destination": "https://github.com/flutter/flutter/wiki/Deferred-Components", "type": 301 }, { "source": "/design-principles", "destination": "https://github.com/flutter/flutter/blob/master/docs/contributing/Style-guide-for-Flutter-repo.md", "type": 301 }, { "source": "/fully-deferred-flutter", "destination": "https://github.com/flutter/flutter/wiki/Deferred-Components#fully-deferring-flutter-in-add-to-app", "type": 301 }, - { "source": "/null-safety", "destination": "https://dart.dev/null-safety", "type": 301 }, + { "source": "/null-safety", "destination": "https://dart.cn/null-safety", "type": 301 }, { "source": "/privacy", "destination": "https://www.google.com/intl/en/policies/privacy", "type": 301 }, { "source": "/report-jank", "destination": "https://github.com/flutter/flutter/issues/74833", "type": 301 }, { "source": "/research-optout", "destination": "https://docs.google.com/forms/d/e/1FAIpQLSeG2Nhj0YQkr3m75P74Zb9G-v7zgNhAE9arCyig-a5B1A8uDw/viewform?usp=sf_link", "type": 301 }, @@ -304,6 +304,7 @@ { "source": "/go/custom-tabs-support", "destination": "https://docs.google.com/document/d/1GvsmPQz6aKixNUphL10XmSOL7M6nOH7W1jYwNp0LwnA", "type": 301 }, { "source": "/go/dart-flutterbuffers", "destination": "https://docs.google.com/document/d/1rqKq6DwqaeBfTLTixxurrdT9HwZ02DyRjFigO9SiB1Q/edit#", "type": 301 }, { "source": "/go/dart-patterns", "destination": "https://docs.google.com/document/d/1p6JV-pvr8_45qI5fumv6Ir60wEeagKCceTngYOXt_U4/edit?usp=sharing&resourcekey=0-jGJyRsTPSIpGPN0xgvzSwg", "type": 301 }, + { "source": "/go/dart-io-as-package", "destination": "https://docs.google.com/document/d/1XIDcawCBVqpsunm1MdeBYggNJ8qnFqqB9WEi7lgnthc", "type": 301 }, { "source": "/go/dart-static-analysis-ir", "destination": "https://docs.google.com/document/d/1xJYGBSoXL7h1z43NnjFsXxauQGXvUnacef4XR1zmeGA/edit#", "type": 301 }, { "source": "/go/dart-tooling-daemon", "destination": "https://docs.google.com/document/d/1Qldlyi2TmzTsDN1AS5AfjE93-A2nR296Np5bZW2aBwU/edit?usp=sharing&resourcekey=0-ckijCX_-ZSy-J_KBI-FQ1Q", "type": 301 }, { "source": "/go/dart-workspace-support", "destination": "https://docs.google.com/document/d/1_SfTg0W8PASZ2neTkNhYjcVDdFvomeoAnZ_XqflIx88/edit?usp=sharing&resourcekey=0-dcmTZFHicV9ZZL863zC5-w", "type": 301 }, @@ -312,6 +313,7 @@ { "source": "/go/data-sync", "destination": "https://docs.google.com/document/d/1yH96-p-SkMmt6hL5xHHDtMvCKRz2XGrMuw9ZY_nE954", "type": 301 }, { "source": "/go/dds-daemon", "destination": "https://docs.google.com/document/d/18IgFakijiv9CLFGT5BckbwZuf2pqhOUeN27mB9XqvpQ/edit?usp=sharing&resourcekey=0-rBHvH9gLXLjGPWt5WE-XFg", "type": 301 }, { "source": "/go/deep-link-flag-migration", "destination": "https://docs.google.com/document/d/1TUhaEhNdi2BUgKWQFEbOzJgmUAlLJwIAhnFfZraKgQs/edit?usp=sharing", "type": 301 }, + { "source": "/go/default-animation-style", "destination": "https://docs.google.com/document/d/18c28hbe1mRBZLcnaip5LM9zlshIOEpuvBLWKZiXGe9g/", "type": 301 }, { "source": "/go/default-scroll-action", "destination": "https://docs.google.com/document/d/1SJvom6k4YW4EtFIY4VpAhAOH-jWhRkHVfpVsOBB56KM/edit?usp=sharing", "type": 301 }, { "source": "/go/deferred-image-decoding", "destination": "https://docs.google.com/document/d/1f-NCEF0lrHGd3DsieS1tZ_NWbYTjA4GTqESMbGFsU2U/edit?ts=5e17a77d&pli=1#", "type": 301 }, { "source": "/go/delegate-route-transitions", "destination": "https://docs.google.com/document/d/10C5VbqhU7FkkDSVlcVZmrl8UyL7nw4CeL4QdPKMjsEk/edit?usp=sharing", "type": 301 }, @@ -368,7 +370,7 @@ { "source": "/go/federated-plugins", "destination": "https://docs.google.com/document/d/1LD7QjmzJZLCopUrFAAE98wOUQpjmguyGTN2wd_89Srs/edit", "type": 301 }, { "source": "/go/ffi-plugins", "destination": "https://docs.google.com/document/d/1vMw-W6L-r-uL1SUgzDh6J5rmtqum7SZdO9khWACrZJI/edit?resourcekey=0-vvjEK88N-pApyKTPWJ2IZQ", "type": 301 }, { "source": "/go/file-system-access-from-devtools", "destination": "https://docs.google.com/document/d/1BNgZka2N9HYL11A4IdR8FqsSW1VMr9Vo7CSrjY9rcic/edit?usp=sharing&resourcekey=0-H1f6lS5KjytrUCWc1vcS_w", "type": 301 }, - { "source": "/go/flame-dartpad", "destination": "https://dartpad.dev/?id=3e52ca7b51ba15f989ad880b8b3314a2", "type": 301 }, + { "source": "/go/flame-dartpad", "destination": "https://dartpad.cn/?id=3e52ca7b51ba15f989ad880b8b3314a2", "type": 301 }, { "source": "/go/flavor-specific-assets", "destination": "https://docs.google.com/document/d/1_3GwdRZ1WPBqR9koNxESfAXHqynv36__ctMqN-NRG0k/edit?usp=sharing", "type": 301 }, { "source": "/go/floating-snackbar-offset", "destination": "https://docs.google.com/document/d/1elP-y83PtvfAZHNcpHCtnOFhZO9VnnlobwfQ33QO4hg/edit", "type": 301 }, { "source": "/go/floating-widgetspans", "destination": "https://docs.google.com/document/d/1I-VqCxvszXGAas_6EE9b6ZIzyMY3HjxDxGW9_DWWd7M/edit", "type": 301 }, @@ -400,7 +402,7 @@ { "source": "/go/flutter-tool-extension-api", "destination": "https://docs.google.com/document/d/12iXm23TP6e6qS1Ntx-i-azcBWByiUl_kWjRxRC2YTz8/edit?usp=sharing&resourcekey=0-pVl2giJzGAHqOYEaZagVow", "type": 301 }, { "source": "/go/flutter-web-scenelets", "destination": "https://docs.google.com/document/d/1GUAx3aqdtEoaBMTNpsS1-i59QZlwTi6vUCASbaanPCo", "type": 301 }, { "source": "/go/focus-management", "destination": "https://docs.google.com/document/d/1-NS3NJFd2j9kzKj5GOPoWq-G0B6jrpiCL892EX5Nxgk/edit", "type": 301 }, - { "source": "/go/forge2d-workshop", "destination": "https://codelabs.developers.google.com/codelabs/flutter-flame-forge2d#0", "type": 301 }, + { "source": "/go/forge2d-workshop", "destination": "https://codelabs.developers.google.cn/codelabs/flutter-flame-forge2d#0", "type": 301 }, { "source": "/go/form-field-autovalidation", "destination": "https://docs.google.com/document/d/16HAURcOtYAoHntDOEtdGy9KkKSItulG9Ldyjzdaosqo/edit", "type": 301 }, { "source": "/go/fragment-program-support", "destination": "https://docs.google.com/document/d/1R0qx3znTe_wcKZoeWwkMlgxs1MtrdiPJ_1xiuExZuH0/edit", "type": 301 }, { "source": "/go/games-revenue", "destination": "https://services.google.com/fh/files/blogs/gaming_ux_and_revenue_optimizations.pdf", "type": 301 }, @@ -409,6 +411,7 @@ { "source": "/go/global-selection", "destination": "https://docs.google.com/document/d/1q_ns8VVTS2vaKqGwr_hheZpsoli52wAM0QWi9_uBdnk", "type": 301 }, { "source": "/go/global-surface-pool-for-macos", "destination": "https://docs.google.com/document/d/1YUDyCQ1ocdFICOdWeZuuoOm_8bmmxWr0CnC-Y-qXuNI/edit?usp=sharing", "type": 301 }, { "source": "/go/globalkey-duplication-refactoring", "destination": "https://docs.google.com/document/d/15U1XDLrP-SXfgeu5DBBsA7MQuFpDUW005Y2ObwmYWIc/", "type": 301 }, + { "source": "/go/glossary-expansion", "destination": "https://docs.google.com/document/d/1Tuv1Zx0F4yMVfxyChSAR21R8eXUi121J7piF_wyBDHg", "type": 301 }, { "source": "/go/gn-ninja-engine-artifacts", "destination": "https://docs.google.com/document/d/10C0yexPKlx4CdlF-fO4efGhQXEvDH92-RiAhBTj5EF8/", "type": 301 }, { "source": "/go/go-router-improvements", "destination": "https://docs.google.com/document/d/1_mRXinbL_rb0mUt6DAFZ8kj0kh33ZjEMJuUq4PJgwj8/edit?usp=sharing&resourcekey=0-sYbRzE9opneOFZ5F8J3gGw", "type": 301 }, { "source": "/go/go-router-redirect", "destination": "https://docs.google.com/document/d/1L940WGrM1YJ8BkJEpNd67fUqoqC6OsTfch4eH86E0xU/edit?usp=sharing&resourcekey=0-9oxsWU1tLpAACTUXyNjpkA", "type": 301 }, @@ -446,7 +449,7 @@ { "source": "/go/implicit-animations", "destination": "https://docs.google.com/document/d/1-gUqKiHf6w_eck1rZqYjQk0MMPOIlYjZtYu1zjsDLPA/edit?usp=sharing", "type": 301 }, { "source": "/go/infinite-scroll", "destination": "https://docs.google.com/document/d/1TV2oF2iLIZtGd48336korxMTQrGizDAASAeZAeteMSc/edit?usp=sharing", "type": 301 }, { "source": "/go/inheritedwidget-subscription", "destination": "https://docs.google.com/document/d/14BhIyj52NFYuyrWXe8bHJTZp7I67iKNmtOQXHCNH5GQ/edit?usp=sharing", "type": 301 }, - { "source": "/go/inheritedwidget-workshop", "destination": "https://dartpad.dev/workshops.html?webserver=https://dartpad-workshops-io2021.web.app/inherited_widget", "type": 301 }, + { "source": "/go/inheritedwidget-workshop", "destination": "https://dartpad.cn/workshops.html?webserver=https://dartpad-workshops-io2021.web.app/inherited_widget", "type": 301 }, { "source": "/go/input-field-autofill", "destination": "https://docs.google.com/document/d/1wYLsoc7NiHl2jFueB4Ros09E3nDCotdWVovDCFSMcAk/edit", "type": 301 }, { "source": "/go/introduce-disposable", "destination": "https://docs.google.com/document/d/1cjylBOczGk70x-sn1iZYVNAfpPZdtGWsm_KzoNQX0jc/edit", "type": 301 }, { "source": "/go/io22concurrency", "destination": "https://github.com/goderbauer/io22concurrency", "type": 301 }, @@ -506,13 +509,14 @@ { "source": "/go/multi-view-sync-over-async", "destination": "https://docs.google.com/document/d/14z-e-x6M3P53ZMD6qBh4UaJ3nJdG_VdMNqGKERv31hw/edit?usp=sharing", "type": 301 }, { "source": "/go/multi-window-single-isolate", "destination": "https://docs.google.com/document/d/1Wdqs79TY3b1VkOZMDmt12psg5AhO-q9k5-Uv28Snr8M/edit?resourcekey=0-qvOf6jo8bR9W4ozLrbLMcQ", "type": 301 }, { "source": "/go/multi-window-status", "destination": "https://docs.google.com/document/d/13E27tD8_9f6lDgwg3MpGNTV8XIRCZH3ByI-t9kI9IUM/edit?usp=sharing", "type": 301 }, + { "source": "/go/multi-window-api", "destination": "https://docs.google.com/document/d/1eQG-IS7r4_S9_h50MY_hSGwUVtgSTRSLzu7MLzPNd2Y/edit", "type": 301 }, { "source": "/go/multiple-applications", "destination": "https://docs.google.com/document/d/1alrr7qimNDazmQx5D80BSHh62V2OINO4UQ5N3HcPnmo/edit?resourcekey=0-wPs1Go9AiKR-yG0-xStuKw", "type": 301 }, { "source": "/go/multiple-engines", "destination": "https://docs.google.com/document/d/1NwiZPWHd1te46eP2GWwIezDV9CdMQkODAMuF5kWdtLw", "type": 301 }, { "source": "/go/multiple-flutters", "destination": "https://docs.google.com/document/d/1fdKRufqUzQvERcqNIUSq-GdabXc4k8VIsClzRElJ6KY", "type": 301 }, { "source": "/go/multiple-views", "destination": "https://docs.google.com/document/d/1Z7Qrb08dOnfB8IxPgsyujVn4MsDcYPUUku9CeF70_S0/edit?usp=sharing", "type": 301 }, { "source": "/go/navigator-with-router", "destination": "https://docs.google.com/document/d/1Q0jx0l4-xymph9O6zLaOY4d_f7YFpNWX_eGbzYxr9wY/edit", "type": 301 }, { "source": "/go/nshc", "destination": "https://docs.google.com/document/d/1uwHQ3ZEGN2cH6bFwa3CCXTTXCeDfOWw-kUa_B6oTMuA/edit", "type": 301 }, - { "source": "/go/null-safety-workshop", "destination": "https://dartpad.dev/workshops.html?webserver=https://dartpad-workshops-io2021.web.app/null_safety_workshop", "type": 301 }, + { "source": "/go/null-safety-workshop", "destination": "https://dartpad.cn/workshops.html?webserver=https://dartpad-workshops-io2021.web.app/null_safety_workshop", "type": 301 }, { "source": "/go/nullable-cupertinothemedata-brightness", "destination": "https://docs.google.com/document/d/1qivq0CdkWGst5LU5iTLFUe_LTfLY84679-NxWiDgJXg/edit", "type": 301 }, { "source": "/go/ondirtycallbacks", "destination": "https://docs.google.com/document/d/1Vk_QWC92fFGxx2oIrIjkCL0ZZFHxmrprlLedyQsnkus/edit?usp=sharing", "type": 301 }, { "source": "/go/opengl-on-ios", "destination":"https://docs.google.com/document/d/1kvrb6HeTRN4noAKO82o6x-Ii61PW-BQ-8s9YNtLgosM", "type": 301 }, @@ -572,7 +576,7 @@ { "source": "/go/sixty-fps", "destination": "https://docs.google.com/document/d/1FuNcBvAPghUyjeqQCOYxSt6lGDAQ1YxsNlOvrUx0Gko/edit", "type": 301 }, { "source": "/go/slider-v2", "destination": "https://docs.google.com/document/d/1NCuRe-TUp8u6-Yzx_wrXZcqAwv5NP8hEJwUYSxVECwU/edit", "type": 301 }, { "source": "/go/sliver-flex-and-friends", "destination": "https://docs.google.com/document/d/1W4_5oD5z7JHhUjuQYwS_NJRAv27Ih7IazcMm739O5JU/edit", "type": 301 }, - { "source": "/go/sliver-workshop", "destination": "https://dartpad.dev/workshops.html?webserver=https://dartpad-workshops-io2021.web.app/getting_started_with_slivers", "type": 301 }, + { "source": "/go/sliver-workshop", "destination": "https://dartpad.cn/workshops.html?webserver=https://dartpad-workshops-io2021.web.app/getting_started_with_slivers", "type": 301 }, { "source": "/go/state-restoration-design", "destination": "https://docs.google.com/document/d/1KIiq5CdqnSXxQXbZIDy2Ukc-JHFyLak1JR8e2cm3eO4/edit", "type": 301 }, { "source": "/go/stateful-macro", "destination": "https://docs.google.com/document/d/1TMVFn2jXw705px7bUggk8vTvpLrUjxEG9mzb-cSqZuo/edit?usp=sharing&resourcekey=0-0s5mvWGH3OcW8GN-Rmr36A", "type": 301 }, { "source": "/go/static-tooling-in-devtools", "destination": "https://docs.google.com/document/d/1i6ISzzSKKDiiVftTnkCCvdgXEjK2eqYlPjCOKTjnvx8/edit?resourcekey=0-uyAiZEjFplyibsAkDAqKJw#", "type": 301 }, @@ -623,6 +627,7 @@ { "source": "/go/update-psc", "destination": "https://docs.google.com/document/d/12OQx7h8UQzzAi0Kxh-saDC2dg7h2fghCCzwJ0ysPmZE/edit?usp=sharing&resourcekey=0-ATO-1Er3HO2HITm59I0IdA", "type": 301 }, { "source": "/go/update-scrollbars", "destination": "https://docs.google.com/document/d/1mRlc-sRyadE6301aZsD1LJkPG2B9K97Bg_GDHvFhMQI/edit?usp=sharing&resourcekey=0-v4Gk8H280RaPo5qClmDqpA", "type": 301 }, { "source": "/go/update-text-theme-api", "destination": "https://docs.google.com/document/d/1B1s4mm6OYM7mKQ3vZfSTI2HR_KljB78gN6oBHg_zYUs/edit", "type": 301 }, + { "source": "/go/updating-material-3-sliders", "destination": "https://docs.google.com/document/d/1JQogsq7WdDt9k4BeBxLfi6CwsA_795tLFZlcFDaB6Gk/edit?usp=sharing", "type": 301 }, { "source": "/go/use-dart-style-in-flutter-engine", "destination": "https://docs.google.com/document/d/1E2ZLNasExXMpSYcxWrd5qSp24WmhIPiFq9FjBC5GoVY?resourcekey=0-bmXuMwfoCn8a9QdQiMd3hA", "type": 301 }, { "source": "/go/using-widget-state-property", "destination": "https://docs.google.com/document/d/1PYnxkFoi3HjBEyuSPonNHJHhsXDc6OOXd-7b4KmfC3g/edit#heading=h.pub7jnop54q0", "type": 301 }, { "source": "/go/variable-refresh-rate", "destination": "https://docs.google.com/document/d/1O-ot6MydAl5pAr_XGnpR-Qq5A5CPDF6edaPu8xQtgCQ/edit?usp=sharing&resourcekey=0-LlXeGtGRC67XL4NrGoc91A", "type": 301 }, @@ -630,6 +635,7 @@ { "source": "/go/verbatim-logical-keys-for-non-latin-layout", "destination": "https://docs.google.com/document/d/1ZNgNxito-NVUS1JKlcjdzHUcKyyiupy8Za-jb131dD4/edit?usp=sharing&resourcekey=0-eeEZ5X0jAzuqSTdmPWlv0w", "type": 301 }, { "source": "/go/web-add-to-app", "destination": "https://docs.google.com/document/d/1rFM0qmYds1JkntTruBh8eO72xbT2KoP9JdbizucAAwQ/edit", "type": 301 }, { "source": "/go/web-astral-projections", "destination": "https://docs.google.com/document/d/1pvH-J8opXsjntTpFf1bbsbU8N1vFd8tPKvBgcNn8UKQ", "type": 301 }, + { "source": "/go/web-cleanup-service-worker", "destination": "https://docs.google.com/document/d/1czOm3Hmy_oIq3NJStezb9AjwkKyta3NospkCy_DDv9E/edit", "type": 301 }, { "source": "/go/web-declarative-bootstrap", "destination": "https://docs.google.com/document/d/1jVXxC0tNDW45ypfVESyHipL2lHCX32GmFyJNO0u9c6Y/edit?resourcekey=0-AQ8z_0_U8Vq3JBdyracNuQ", "type": 301 }, { "source": "/go/web-multiview-js-api", "destination": "https://docs.google.com/document/d/1ixwPBG7YIHEONc15t9SOmrfgDK3gghvkk7it_8AFOmw/edit?resourcekey=0-VQC2nby6Coe5OG-R833yXw", "type": 301 }, { "source": "/go/web-native-text-editing", "destination": "https://docs.google.com/document/d/1t6qAX46tsR1tdBS42yro6G_5Igtrj7WzmKKiUI_JC-k/edit", "type": 301 }, @@ -658,7 +664,7 @@ { "source": "/to/android-setup", "destination": "/platform-integration/android/install-android", "type": 301 }, { "source": "/to/android-supported-architectures", "destination": "/deployment/android#what-are-the-supported-target-architectures", "type": 301 }, { "source": "/to/asset-from-package", "destination": "/ui/assets/assets-and-images#from-packages", "type": 301 }, - { "source": "/to/brick-breaker", "destination": "https://codelabs.developers.google.com/codelabs/flutter-flame-brick-breaker", "type": 301 }, + { "source": "/to/brick-breaker", "destination": "https://codelabs.developers.google.cn/codelabs/flutter-flame-brick-breaker", "type": 301 }, { "source": "/to/build-modes", "destination": "/testing/build-modes", "type": 301 }, { "source": "/to/china-setup", "destination": "/community/china", "type": 301 }, { "source": "/to/crash-reporting", "destination": "/reference/crash-reporting", "type": 301 }, @@ -670,12 +676,18 @@ { "source": "/to/develop-plugins", "destination": "/packages-and-plugins/developing-packages#plugin", "type": 301 }, { "source": "/to/edit-plugins", "destination": "/packages-and-plugins/developing-packages#edit-plugin-package", "type": 301 }, { "source": "/to/editor-setup", "destination": "/get-started/editor", "type": 301 }, + { "source": "/to/engine-rbe", "destination": "https://github.com/flutter/engine/blob/main/docs/rbe/rbe.md", "type": 301 }, + { "source": "/to/engine-tool", "destination": "https://github.com/flutter/engine/blob/main/tools/engine_tool/README.md", "type": 301 }, + { "source": "/to/engine-tool-bug", "destination": "https://github.com/flutter/flutter/issues/new?labels=e:%20engine-tool", "type": 301 }, { "source": "/to/endorsed-federated-plugin", "destination": "/packages-and-plugins/developing-packages#endorsed-federated-plugin", "type": 301 }, + { "source": "/to/et", "destination": "https://docs.flutter.cn/to/engine-tool", "type": 301 }, { "source": "/to/federated-plugins", "destination": "/packages-and-plugins/developing-packages#federated-plugins", "type": 301 }, { "source": "/to/ffi-package", "destination": "/packages-and-plugins/developing-packages#plugin-ffi", "type": 301 }, + { "source": "/to/flutter-gen-deprecation", "destination": "/release/breaking-changes/flutter-generate-i10n-source", "type": 301 }, + { "source": "/to/flutter-plugins-configuration", "destination": "/release/breaking-changes/flutter-plugins-configuration", "type": 301 }, { "source": "/to/flutter-fix", "destination": "/tools/flutter-fix", "type": 301 }, { "source": "/to/flutter-gradle-plugin-apply", "destination": "/release/breaking-changes/flutter-gradle-plugin-apply", "type": 301 }, - { "source": "/to/flutter-test-docs", "destination": "https://api.flutter.dev/flutter/flutter_test/flutter_test-library.html", "type": 301 }, + { "source": "/to/flutter-test-docs", "destination": "https://api.flutter-io.cn/flutter/flutter_test/flutter_test-library.html", "type": 301 }, { "source": "/to/font-from-package", "destination": "/cookbook/design/package-fonts#use", "type": 301 }, { "source": "/to/gesture-disambiguation", "destination": "/ui/interactivity/gestures#gesture-disambiguation", "type": 301 }, { "source": "/to/gestures", "destination": "/ui/interactivity/gestures", "type": 301 }, @@ -694,6 +706,7 @@ { "source": "/to/ios-development-team", "destination": "/deployment/ios#review-xcode-project-settings", "type": 301 }, { "source": "/to/ios-ffi", "destination": "/platform-integration/ios/c-interop", "type": 301 }, { "source": "/to/ios-minimum-target", "destination": "/deployment/ios#review-xcode-project-settings", "type": 301 }, + { "source": "/to/to/java-gradle-incompatibility", "destination": "/release/breaking-changes/android-java-gradle-migration-guide", "type": 301 }, { "source": "/to/java-gradle-incompatibility", "destination": "/release/breaking-changes/android-java-gradle-migration-guide", "type": 301 }, { "source": "/to/linux-android-setup", "destination": "/get-started/install/linux/android", "type": 301 }, { "source": "/to/macos-android-setup", "destination": "/get-started/install/macos/mobile-android", "type": 301 }, @@ -709,7 +722,7 @@ { "source": "/to/platform-plugins", "destination": "/packages-and-plugins/using-packages", "type": 301 }, { "source": "/to/previous-releases", "destination": "/release/archive", "type": 301 }, { "source": "/to/profile-mode", "destination": "/testing/build-modes#profile", "type": 301 }, - { "source": "/to/pub-system-cache", "destination": "https://dart.dev/tools/pub/glossary#system-cache", "type": 301 }, + { "source": "/to/pub-system-cache", "destination": "https://dart.cn/tools/pub/glossary#system-cache", "type": 301 }, { "source": "/to/pubspec-plugin-platforms", "destination": "/packages-and-plugins/developing-packages#plugin-platforms", "type": 301 }, { "source": "/to/recommend-const", "destination": "/perf/best-practices#control-build-cost", "type": 301 }, { "source": "/to/reference-keystore", "destination": "/deployment/android#reference-the-keystore-from-the-app", "type": 301 }, @@ -732,6 +745,7 @@ { "source": "/to/use-profile-mode", "destination": "/perf/ui-performance#run-in-profile-mode", "type": 301 }, { "source": "/to/wasm", "destination": "/platform-integration/web/wasm", "type": 301 }, { "source": "/to/web-bootstrapping", "destination": "/platform-integration/web/initialization", "type": 301 }, + { "source": "/to/web-html-renderer-deprecation", "destination": "https://github.com/flutter/flutter/issues/145954", "type": 301 }, { "source": "/to/web-images", "destination": "/platform-integration/web/web-images", "type": 301 }, { "source": "/to/web-multiview-runwidget", "destination": "/platform-integration/web/embedding-flutter-web#replace-runapp-by-runwidget-in-dart", "type": 301 }, { "source": "/to/web-renderers", "destination": "/platform-integration/web/renderers", "type": 301 }, diff --git a/package.json b/package.json index 0b5a2abeea..0f8c5d3b7f 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "node": ">=20.12.0", "pnpm": ">=9.1.0" }, - "packageManager": "pnpm@9.11.0", + "packageManager": "pnpm@9.12.2", "scripts": { "serve": "PRODUCTION=false eleventy --serve", "build-site-for-staging": "PRODUCTION=false eleventy", @@ -22,10 +22,10 @@ "bootstrap-scss": "^4.6.2" }, "devDependencies": { - "@11ty/eleventy": "3.0.0-alpha.20", - "firebase-tools": "^13.20.0", + "@11ty/eleventy": "^3.0.0", + "firebase-tools": "^13.22.1", "hast-util-from-html": "^2.0.3", - "hast-util-select": "^6.0.2", + "hast-util-select": "^6.0.3", "hast-util-to-text": "^4.0.2", "html-minifier-terser": "^7.2.0", "js-yaml": "^4.1.0", @@ -35,7 +35,7 @@ "markdown-it-container": "^4.0.0", "markdown-it-deflist": "^3.0.0", "markdown-it-footnote": "^4.0.0", - "sass": "^1.79.3", - "shiki": "^1.19.0" + "sass": "^1.80.2", + "shiki": "^1.22.0" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f8491fca16..f1525bf601 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,17 +13,17 @@ importers: version: 4.6.2 devDependencies: '@11ty/eleventy': - specifier: 3.0.0-alpha.20 - version: 3.0.0-alpha.20 + specifier: ^3.0.0 + version: 3.0.0 firebase-tools: - specifier: ^13.20.0 - version: 13.20.0(encoding@0.1.13) + specifier: ^13.22.1 + version: 13.22.1(encoding@0.1.13) hast-util-from-html: specifier: ^2.0.3 version: 2.0.3 hast-util-select: - specifier: ^6.0.2 - version: 6.0.2 + specifier: ^6.0.3 + version: 6.0.3 hast-util-to-text: specifier: ^4.0.2 version: 4.0.2 @@ -52,11 +52,11 @@ importers: specifier: ^4.0.0 version: 4.0.0 sass: - specifier: ^1.79.3 - version: 1.79.3 + specifier: ^1.80.2 + version: 1.80.2 shiki: - specifier: ^1.19.0 - version: 1.19.0 + specifier: ^1.22.0 + version: 1.22.0 packages: @@ -71,16 +71,16 @@ packages: engines: {node: '>=18'} hasBin: true - '@11ty/eleventy-plugin-bundle@2.0.2': - resolution: {integrity: sha512-zGyPp1g6bi+VC2I5ylwj4w29nivDmx4Uki5gWY6v3MT/1muK0JTtnc1KOMC7yUurv6YwtwdiLYyFK2eFyKv2wg==} + '@11ty/eleventy-plugin-bundle@3.0.0': + resolution: {integrity: sha512-JSnqehT+sWSPi6e44jTXUW+KiV9284YF9fzPQvfGB4cXlk/m/SJk17CavHCleIvKXDN+jrUw9TZkwAwr85ONWQ==} engines: {node: '>=18'} '@11ty/eleventy-utils@1.0.3': resolution: {integrity: sha512-nULO91om7vQw4Y/UBjM8i7nJ1xl+/nyK4rImZ41lFxiY2d+XUz7ChAj1CDYFjrLZeu0utAYJTZ45LlcHTkUG4g==} engines: {node: '>=12'} - '@11ty/eleventy@3.0.0-alpha.20': - resolution: {integrity: sha512-9X3Bu153VccE/y9y9IMXpuwDRi2T+WaCslZmetUYtBzyeATbmcknYfhCbB/WxkzPHnrL9euJH7ytv872Ki+XLQ==} + '@11ty/eleventy@3.0.0': + resolution: {integrity: sha512-0P0ZsJXVW2QiNdhd7z+GYy6n+ivh0enx1DRdua5ta6NlzY2AhbkeWBY6U+FKA8lPS3H4+XsTpfLLfIScpPZLaQ==} engines: {node: '>=18'} hasBin: true @@ -109,11 +109,11 @@ packages: '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - '@electric-sql/pglite@0.2.8': - resolution: {integrity: sha512-0wSmQu22euBRzR5ghqyIHnBH4MfwlkL5WstOrrA3KOsjEWEglvoL/gH92JajEUA6Ufei/+qbkB2hVloC/K/RxQ==} + '@electric-sql/pglite@0.2.12': + resolution: {integrity: sha512-J/X42ujcoFEbOkgRyoNqZB5qcqrnJRWVlwpH3fKYoJkTz49N91uAK/rDSSG/85WRas9nC9mdV4FnMTxnQWE/rw==} - '@google-cloud/cloud-sql-connector@1.3.4': - resolution: {integrity: sha512-Lw05ME/W9mDzJuQwGwzHl9dqJtN1zBpyK6A3NbjhBi/V1WZpsIk1RgqR6+5LIbMurcNRia9ITOlCjsgJY+H92A==} + '@google-cloud/cloud-sql-connector@1.4.0': + resolution: {integrity: sha512-OUXs2f91u3afbFjufCJom9lF+GgS9if4F/eKxrLvdkbwkYAQrQUOY6Jw4YfVXUxF3oNDioTgZ4fpwt1MQXwfKg==} engines: {node: '>=14'} '@google-cloud/paginator@5.0.2': @@ -132,16 +132,16 @@ packages: resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} engines: {node: '>=14'} - '@google-cloud/pubsub@4.7.2': - resolution: {integrity: sha512-N9Cziu5d7sju4gtHsbbjOXDMCewNwGaPZ/o+sBbWl9sBR7S+kHkD4BVg6hCi9SvH1sst0AGan8UAQAxbac8cRg==} + '@google-cloud/pubsub@4.8.0': + resolution: {integrity: sha512-H9S4i5mAeQg5A4MZox8XfWnoxlMehlIn8QHWZ3iOj7Kz/yaHufsI5JtSGaezjZv+wF4elur5Yycygnl6pWHSyg==} engines: {node: '>=14.0.0'} - '@googleapis/sqladmin@19.0.0': - resolution: {integrity: sha512-65zgEpQLhpTZqUic+pm4BbdDByN9NsHkphfCIwzpx3fccHPc6OuKsW0XexYCq9oTUtTC4QRjFisBDLV9fChRtg==} + '@googleapis/sqladmin@24.0.0': + resolution: {integrity: sha512-Sj2MerYrr4Z6ksK81Scj0gIdFjC3bC0vcqdM+TSfnOskg6d9iIALWdFDc3xgNHQWO58rUb6HjBzr1XbuNjYlPg==} engines: {node: '>=12.0.0'} - '@grpc/grpc-js@1.11.3': - resolution: {integrity: sha512-i9UraDzFHMR+Iz/MhFLljT+fCpgxZ3O6CxwGJ8YuNYHJItIHUzKJpW2LvoFZNnGPwqc9iWy9RAucxV0JoR9aUQ==} + '@grpc/grpc-js@1.12.2': + resolution: {integrity: sha512-bgxdZmgTrJZX50OjyVwz3+mNEnCTNkh3cIqGPWVNeW9jX6bn1ZkU80uPd+67/ZpIJIjRQ9qaHCjhavyoWYxumg==} engines: {node: '>=12.10.0'} '@grpc/proto-loader@0.7.13': @@ -208,6 +208,82 @@ packages: resolution: {integrity: sha512-U9PJlOswJPSgQVPI+XEuNLElyFWkb0hAiMg+DExD9V0St03X2lPHGMdxMY/LrVmoukuIpXJ12oyrOtEZ4uXFkw==} engines: {node: '>=14'} + '@parcel/watcher-android-arm64@2.4.1': + resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.4.1': + resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.4.1': + resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.4.1': + resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.4.1': + resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.4.1': + resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.4.1': + resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.4.1': + resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.4.1': + resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.4.1': + resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.4.1': + resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.4.1': + resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.4.1': + resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} + engines: {node: '>= 10.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -254,20 +330,20 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@shikijs/core@1.19.0': - resolution: {integrity: sha512-314J5MPdS1wzfjuD856MXvbAI2wN03ofMnUGkZ5ZDBOza/d38paLwd+YVyuKrrjxJ4hfPMjc4tRmPkXd6UDMPQ==} + '@shikijs/core@1.22.0': + resolution: {integrity: sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==} - '@shikijs/engine-javascript@1.19.0': - resolution: {integrity: sha512-D1sioU61n7fLWfDzTC9JNS19zEYZMr7qxkSVzv6ziEWDxnwzy2PvYoKPedJV4qUf+2VnrYPSaArDz2W0XgGB7A==} + '@shikijs/engine-javascript@1.22.0': + resolution: {integrity: sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==} - '@shikijs/engine-oniguruma@1.19.0': - resolution: {integrity: sha512-/JxwIefNVLGB4EmpB8i6P4JB/oVYRuzSixbqvx7m6iPW0lQ1T97c/0wmA+JlKbngEiExckSuPwa48fajlShB7A==} + '@shikijs/engine-oniguruma@1.22.0': + resolution: {integrity: sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==} - '@shikijs/types@1.19.0': - resolution: {integrity: sha512-NZvVp3k1bP4MTRUbmnkGhYzPdoNMjNLSAwczMRUbtUl4oj2LlNRNbwERyeIyJt56Ac9fvPVZ2nn13OXk86E5UQ==} + '@shikijs/types@1.22.0': + resolution: {integrity: sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==} - '@shikijs/vscode-textmate@9.2.2': - resolution: {integrity: sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg==} + '@shikijs/vscode-textmate@9.3.0': + resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} @@ -312,8 +388,8 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/node@22.7.3': - resolution: {integrity: sha512-qXKfhXXqGTyBskvWEzJZPUxSslAiLaB6JGP1ic/XTH9ctGgzdgYguuLP1C601aRTSDNlLb0jbKqXjZ48GNraSA==} + '@types/node@22.7.6': + resolution: {integrity: sha512-/d7Rnj0/ExXDMcioS78/kf1lMzYk4BZV8MZGTBKzTGZ6/406ukkbYlIsZmMPhcR5KlkunDHQLrtAVmSq7r+mSw==} '@types/request@2.48.12': resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==} @@ -349,8 +425,8 @@ packages: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn@8.13.0: + resolution: {integrity: sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==} engines: {node: '>=0.4.0'} hasBin: true @@ -488,8 +564,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - basic-auth-connect@1.0.0: - resolution: {integrity: sha512-kiV+/DTgVro4aZifY/hwRwALBISViL5NP4aReaR2EVJEObpbUBHIkdJh/YpcoEiYt7nBodZ6U2ajZeZvSxUCCg==} + basic-auth-connect@1.1.0: + resolution: {integrity: sha512-rKcWjfiRZ3p5WS9e5q6msXa07s6DaFAMXoyowV+mb2xQG+oYdw2QEUyKi0Xp95JvXzShlM+oGy5QuqSK6TfC1Q==} basic-auth@2.0.1: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} @@ -766,8 +842,8 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} core-util-is@1.0.3: @@ -899,6 +975,11 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev-ip@1.0.1: resolution: {integrity: sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==} engines: {node: '>= 0.8.0'} @@ -1084,8 +1165,8 @@ packages: exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - express@4.21.0: - resolution: {integrity: sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==} + express@4.21.1: + resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==} engines: {node: '>= 0.10.0'} extend-shallow@2.0.1: @@ -1112,8 +1193,8 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-uri@3.0.2: - resolution: {integrity: sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==} + fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} fast-url-parser@1.1.3: resolution: {integrity: sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==} @@ -1148,8 +1229,8 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} - firebase-tools@13.20.0: - resolution: {integrity: sha512-MzNGYdJxoo2qeI19jB1ByZGRnGHyjM3555MwnqcVTA/nyhFZTqKJu5zMGGM/YjIIJp9k/ESbq75HQ+IuJQc+QQ==} + firebase-tools@13.22.1: + resolution: {integrity: sha512-+L2UdveGuYnTId5ThTv21Lp2T9C6fsAsVU0endz2H+evoGftfBhpTfDTNHO8Gl5/0YrSgeqffRgb/cXe7ygJ1g==} engines: {node: '>=18.0.0 || >=20.0.0'} hasBin: true @@ -1160,12 +1241,12 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - form-data@2.5.1: - resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + form-data@2.5.2: + resolution: {integrity: sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==} engines: {node: '>= 0.12'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} forwarded@0.2.0: @@ -1246,8 +1327,8 @@ packages: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} - google-auth-library@9.14.1: - resolution: {integrity: sha512-Rj+PMjoNFGFTmtItH7gHfbHpGVSb3vmnGK3nwNBqxQF9NoBpttSZI/rc0WiM63ma2uGDQtYEkMHkK9U6937NiA==} + google-auth-library@9.14.2: + resolution: {integrity: sha512-R+FRIfk1GBo3RdlRYWPdwk8nmtVUOn6+BkDomAC46KoU8kzXzE1HLmOasSCbWUByMMAGkknVF0G5kQ69Vj7dlA==} engines: {node: '>=14'} google-gax@4.4.1: @@ -1313,14 +1394,14 @@ packages: hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - hast-util-select@6.0.2: - resolution: {integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==} + hast-util-select@6.0.3: + resolution: {integrity: sha512-OVRQlQ1XuuLP8aFVLYmC2atrfWHS5UD3shonxpnyrjcCkwtvmt/+N6kYJdcY4mkMJhxp4kj2EFIxQ9kvkkt/eQ==} hast-util-to-html@9.0.3: resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} - hast-util-to-string@3.0.0: - resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} hast-util-to-text@4.0.2: resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} @@ -1649,8 +1730,8 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - liquidjs@10.17.0: - resolution: {integrity: sha512-M4MC5/nencttIJHirl5jFTkl7Yu+grIDLn3Qgl7BPAD3BsbTCQknDxlG5VXWRwslWIjk8lSZZjVq9LioILDk1Q==} + liquidjs@10.18.0: + resolution: {integrity: sha512-gCJPmpmZ3oi2rMMHo/c+bW1LaRF+ZAKYTWQmKXPp0uK9EkWMFRmgbk3+Io4LSJGAOnpCZSgHJbNzcygx3kfAAQ==} engines: {node: '>=14'} hasBin: true @@ -1936,8 +2017,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nan@2.20.0: - resolution: {integrity: sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==} + nan@2.22.0: + resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==} nearley@2.20.1: resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} @@ -1957,6 +2038,9 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-emoji@2.1.3: resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} engines: {node: '>=18'} @@ -1987,9 +2071,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - not@0.1.0: - resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -2105,8 +2186,8 @@ packages: parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.2.0: + resolution: {integrity: sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -2170,8 +2251,8 @@ packages: pgpass@1.0.5: resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -2343,12 +2424,12 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.0.1: - resolution: {integrity: sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==} + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} engines: {node: '>= 14.16.0'} - regex@4.3.2: - resolution: {integrity: sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw==} + regex@4.3.3: + resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==} registry-auth-token@5.0.2: resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} @@ -2425,8 +2506,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.79.3: - resolution: {integrity: sha512-m7dZxh0W9EZ3cw50Me5GOuYm/tVAJAn91SUnohLRo9cXBixGUOdvmryN+dXpwR831bhoY3Zv7rEFt85PUwTmzA==} + sass@1.80.2: + resolution: {integrity: sha512-9wXY8cGBlUmoUoT+vwOZOFCiS+naiWVjqlreN9ar9PudXbGwlMTFwCR5K9kB4dFumJ6ib98wZyAObJKsWf1nAA==} engines: {node: '>=14.0.0'} hasBin: true @@ -2458,6 +2539,10 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} + send@0.19.1: + resolution: {integrity: sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==} + engines: {node: '>= 0.8.0'} + serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} @@ -2485,8 +2570,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.19.0: - resolution: {integrity: sha512-Ng7Gd6XgWFLsv4Z3so65hOyXjV78qz1M117MuZHwdPQD6fgb5wR2IoLMvSlM/Ml14EXH7n+/YxIpTD74i7kDdw==} + shiki@1.22.0: + resolution: {integrity: sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -2553,8 +2638,8 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - sql-formatter@15.4.2: - resolution: {integrity: sha512-Pw4aAgfuyml/SHMlhbJhyOv+GR+Z1HNb9sgX3CVBVdN5YNM+v2VWkYJ3NNbYS7cu37GY3vP/PgnwoVynCuXRxg==} + sql-formatter@15.4.3: + resolution: {integrity: sha512-RnYhnCojj9jlaVr04Vol2E0aUnZuunUq3gArnzwagsyV5mBXeX6r1rRfHdDzyDkO1NcsPiHCs9ik00Kf9AUMfQ==} hasBin: true ssri@10.0.6: @@ -2654,8 +2739,8 @@ packages: resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} engines: {node: '>=14'} - terser@5.34.0: - resolution: {integrity: sha512-y5NUX+U9HhVsK/zihZwoq4r9dICLyV2jXGOriDAVOeKhq3LKVjgJbGO90FisozXLlJfvjHqgckGmJFBb9KYoWQ==} + terser@5.36.0: + resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} engines: {node: '>=10'} hasBin: true @@ -2707,8 +2792,12 @@ packages: resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} engines: {node: '>= 14.0.0'} - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.0: + resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} @@ -2857,12 +2946,12 @@ packages: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} - winston-transport@4.7.1: - resolution: {integrity: sha512-wQCXXVgfv/wUPOfb2x0ruxzwkcZfxcktz6JIMUaPLmcNhO4bZTwA/WtDWK74xV3F2dKu8YadrFv0qhwYjVEwhA==} + winston-transport@4.8.0: + resolution: {integrity: sha512-qxSTKswC6llEMZKgCQdaWgDuMJQnhuvF5f2Nk3SNXc4byfQ+voo2mX1Px9dkNOuR8p0KAjfPG29PuYUSIb+vSA==} engines: {node: '>= 12.0.0'} - winston@3.14.2: - resolution: {integrity: sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg==} + winston@3.15.0: + resolution: {integrity: sha512-RhruH2Cj0bV0WgNL+lOfoUBI4DVfdUNjVnJGVovWZmrcKtrFTTRzgXYK2O9cymSGjrERCtaAeHwMNnUWXlwZow==} engines: {node: '>= 12.0.0'} wrap-ansi@6.2.0: @@ -2922,8 +3011,8 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.5.1: - resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} + yaml@2.6.0: + resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} engines: {node: '>= 14'} hasBin: true @@ -2959,7 +3048,7 @@ snapshots: '@11ty/dependency-tree-esm@1.0.0': dependencies: '@11ty/eleventy-utils': 1.0.3 - acorn: 8.12.1 + acorn: 8.13.0 dependency-graph: 0.11.0 normalize-path: 3.0.0 @@ -2978,7 +3067,7 @@ snapshots: minimist: 1.2.8 morphdom: 2.7.4 please-upgrade-node: 3.2.0 - send: 0.19.0 + send: 0.19.1 ssri: 11.0.0 urlpattern-polyfill: 10.0.0 ws: 8.18.0 @@ -2987,22 +3076,24 @@ snapshots: - supports-color - utf-8-validate - '@11ty/eleventy-plugin-bundle@2.0.2': + '@11ty/eleventy-plugin-bundle@3.0.0(posthtml@0.16.6)': dependencies: debug: 4.3.7 + posthtml-match-helper: 2.0.2(posthtml@0.16.6) transitivePeerDependencies: + - posthtml - supports-color '@11ty/eleventy-utils@1.0.3': dependencies: normalize-path: 3.0.0 - '@11ty/eleventy@3.0.0-alpha.20': + '@11ty/eleventy@3.0.0': dependencies: '@11ty/dependency-tree': 3.0.1 '@11ty/dependency-tree-esm': 1.0.0 '@11ty/eleventy-dev-server': 2.0.4 - '@11ty/eleventy-plugin-bundle': 2.0.2 + '@11ty/eleventy-plugin-bundle': 3.0.0(posthtml@0.16.6) '@11ty/eleventy-utils': 1.0.3 '@11ty/lodash-custom': 4.17.21 '@11ty/posthtml-urls': 1.0.0 @@ -3023,7 +3114,7 @@ snapshots: iso-639-1: 3.1.3 js-yaml: 4.1.0 kleur: 4.1.5 - liquidjs: 10.17.0 + liquidjs: 10.18.0 luxon: 3.5.0 markdown-it: 14.1.0 micromatch: 4.0.8 @@ -3082,13 +3173,13 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@electric-sql/pglite@0.2.8': {} + '@electric-sql/pglite@0.2.12': {} - '@google-cloud/cloud-sql-connector@1.3.4(encoding@0.1.13)': + '@google-cloud/cloud-sql-connector@1.4.0(encoding@0.1.13)': dependencies: - '@googleapis/sqladmin': 19.0.0(encoding@0.1.13) + '@googleapis/sqladmin': 24.0.0(encoding@0.1.13) gaxios: 6.7.1(encoding@0.1.13) - google-auth-library: 9.14.1(encoding@0.1.13) + google-auth-library: 9.14.2(encoding@0.1.13) p-throttle: 5.1.0 transitivePeerDependencies: - encoding @@ -3105,7 +3196,7 @@ snapshots: '@google-cloud/promisify@4.0.0': {} - '@google-cloud/pubsub@4.7.2(encoding@0.1.13)': + '@google-cloud/pubsub@4.8.0(encoding@0.1.13)': dependencies: '@google-cloud/paginator': 5.0.2 '@google-cloud/precise-date': 4.0.0 @@ -3115,7 +3206,7 @@ snapshots: '@opentelemetry/semantic-conventions': 1.26.0 arrify: 2.0.1 extend: 3.0.2 - google-auth-library: 9.14.1(encoding@0.1.13) + google-auth-library: 9.14.2(encoding@0.1.13) google-gax: 4.4.1(encoding@0.1.13) heap-js: 2.5.0 is-stream-ended: 0.1.4 @@ -3125,14 +3216,14 @@ snapshots: - encoding - supports-color - '@googleapis/sqladmin@19.0.0(encoding@0.1.13)': + '@googleapis/sqladmin@24.0.0(encoding@0.1.13)': dependencies: googleapis-common: 7.2.0(encoding@0.1.13) transitivePeerDependencies: - encoding - supports-color - '@grpc/grpc-js@1.11.3': + '@grpc/grpc-js@1.12.2': dependencies: '@grpc/proto-loader': 0.7.13 '@js-sdsl/ordered-map': 4.4.2 @@ -3211,6 +3302,62 @@ snapshots: '@opentelemetry/semantic-conventions@1.26.0': {} + '@parcel/watcher-android-arm64@2.4.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.4.1': + optional: true + + '@parcel/watcher-darwin-x64@2.4.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.4.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.4.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.4.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.4.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.4.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.4.1': + optional: true + + '@parcel/watcher-win32-arm64@2.4.1': + optional: true + + '@parcel/watcher-win32-ia32@2.4.1': + optional: true + + '@parcel/watcher-win32-x64@2.4.1': + optional: true + + '@parcel/watcher@2.4.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.4.1 + '@parcel/watcher-darwin-arm64': 2.4.1 + '@parcel/watcher-darwin-x64': 2.4.1 + '@parcel/watcher-freebsd-x64': 2.4.1 + '@parcel/watcher-linux-arm-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-glibc': 2.4.1 + '@parcel/watcher-linux-arm64-musl': 2.4.1 + '@parcel/watcher-linux-x64-glibc': 2.4.1 + '@parcel/watcher-linux-x64-musl': 2.4.1 + '@parcel/watcher-win32-arm64': 2.4.1 + '@parcel/watcher-win32-ia32': 2.4.1 + '@parcel/watcher-win32-x64': 2.4.1 + '@pkgjs/parseargs@0.11.0': optional: true @@ -3249,32 +3396,32 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@shikijs/core@1.19.0': + '@shikijs/core@1.22.0': dependencies: - '@shikijs/engine-javascript': 1.19.0 - '@shikijs/engine-oniguruma': 1.19.0 - '@shikijs/types': 1.19.0 - '@shikijs/vscode-textmate': 9.2.2 + '@shikijs/engine-javascript': 1.22.0 + '@shikijs/engine-oniguruma': 1.22.0 + '@shikijs/types': 1.22.0 + '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 hast-util-to-html: 9.0.3 - '@shikijs/engine-javascript@1.19.0': + '@shikijs/engine-javascript@1.22.0': dependencies: - '@shikijs/types': 1.19.0 - '@shikijs/vscode-textmate': 9.2.2 + '@shikijs/types': 1.22.0 + '@shikijs/vscode-textmate': 9.3.0 oniguruma-to-js: 0.4.3 - '@shikijs/engine-oniguruma@1.19.0': + '@shikijs/engine-oniguruma@1.22.0': dependencies: - '@shikijs/types': 1.19.0 - '@shikijs/vscode-textmate': 9.2.2 + '@shikijs/types': 1.22.0 + '@shikijs/vscode-textmate': 9.3.0 - '@shikijs/types@1.19.0': + '@shikijs/types@1.22.0': dependencies: - '@shikijs/vscode-textmate': 9.2.2 + '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 - '@shikijs/vscode-textmate@9.2.2': {} + '@shikijs/vscode-textmate@9.3.0': {} '@sindresorhus/is@4.6.0': {} @@ -3314,16 +3461,16 @@ snapshots: '@types/mdurl@2.0.0': {} - '@types/node@22.7.3': + '@types/node@22.7.6': dependencies: undici-types: 6.19.8 '@types/request@2.48.12': dependencies: '@types/caseless': 0.12.5 - '@types/node': 22.7.3 + '@types/node': 22.7.6 '@types/tough-cookie': 4.0.5 - form-data: 2.5.1 + form-data: 2.5.2 '@types/tough-cookie@4.0.5': {} @@ -3349,9 +3496,9 @@ snapshots: acorn-walk@8.3.4: dependencies: - acorn: 8.12.1 + acorn: 8.13.0 - acorn@8.12.1: {} + acorn@8.13.0: {} agent-base@6.0.2: dependencies: @@ -3385,7 +3532,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.2 + fast-uri: 3.0.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -3466,7 +3613,7 @@ snapshots: ast-types@0.13.4: dependencies: - tslib: 2.7.0 + tslib: 2.8.0 async-lock@1.4.1: {} @@ -3487,7 +3634,9 @@ snapshots: base64-js@1.5.1: {} - basic-auth-connect@1.0.0: {} + basic-auth-connect@1.1.0: + dependencies: + tsscmp: 1.0.6 basic-auth@2.0.1: dependencies: @@ -3612,7 +3761,7 @@ snapshots: camel-case@4.1.2: dependencies: pascal-case: 3.1.2 - tslib: 2.7.0 + tslib: 2.8.0 camelcase@6.3.0: {} @@ -3649,7 +3798,7 @@ snapshots: chokidar@4.0.1: dependencies: - readdirp: 4.0.1 + readdirp: 4.0.2 chownr@2.0.0: {} @@ -3811,7 +3960,7 @@ snapshots: cookie-signature@1.0.6: {} - cookie@0.6.0: {} + cookie@0.7.1: {} core-util-is@1.0.3: {} @@ -3914,6 +4063,8 @@ snapshots: destroy@1.2.0: {} + detect-libc@1.0.3: {} + dev-ip@1.0.1: {} devlop@1.1.0: @@ -3945,7 +4096,7 @@ snapshots: dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.0 dot-prop@5.3.0: dependencies: @@ -4037,7 +4188,7 @@ snapshots: esm-import-transformer@3.0.2: dependencies: - acorn: 8.12.1 + acorn: 8.13.0 esprima@4.0.1: {} @@ -4086,14 +4237,14 @@ snapshots: exponential-backoff@3.1.1: optional: true - express@4.21.0: + express@4.21.1: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.6.0 + cookie: 0.7.1 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 @@ -4148,7 +4299,7 @@ snapshots: fast-json-stable-stringify@2.1.0: {} - fast-uri@3.0.2: {} + fast-uri@3.0.3: {} fast-url-parser@1.1.3: dependencies: @@ -4196,11 +4347,11 @@ snapshots: transitivePeerDependencies: - supports-color - firebase-tools@13.20.0(encoding@0.1.13): + firebase-tools@13.22.1(encoding@0.1.13): dependencies: - '@electric-sql/pglite': 0.2.8 - '@google-cloud/cloud-sql-connector': 1.3.4(encoding@0.1.13) - '@google-cloud/pubsub': 4.7.2(encoding@0.1.13) + '@electric-sql/pglite': 0.2.12 + '@google-cloud/cloud-sql-connector': 1.4.0(encoding@0.1.13) + '@google-cloud/pubsub': 4.8.0(encoding@0.1.13) abort-controller: 3.0.0 ajv: 6.12.6 archiver: 7.0.1 @@ -4219,14 +4370,14 @@ snapshots: deep-equal-in-any-order: 2.0.6 exegesis: 4.2.0 exegesis-express: 4.0.0 - express: 4.21.0 + express: 4.21.1 filesize: 6.4.0 - form-data: 4.0.0 + form-data: 4.0.1 fs-extra: 10.1.0 fuzzy: 0.1.3 gaxios: 6.7.1(encoding@0.1.13) glob: 10.4.5 - google-auth-library: 9.14.1(encoding@0.1.13) + google-auth-library: 9.14.2(encoding@0.1.13) inquirer: 8.2.6 inquirer-autocomplete-prompt: 2.0.1(inquirer@8.2.6) jsonwebtoken: 9.0.2 @@ -4248,9 +4399,8 @@ snapshots: progress: 2.0.3 proxy-agent: 6.4.0 retry: 0.13.1 - rimraf: 5.0.10 semver: 7.6.3 - sql-formatter: 15.4.2 + sql-formatter: 15.4.3 stream-chain: 2.2.5 stream-json: 1.8.0 strip-ansi: 6.0.1 @@ -4262,10 +4412,10 @@ snapshots: universal-analytics: 0.5.3 update-notifier-cjs: 5.1.6(encoding@0.1.13) uuid: 8.3.2 - winston: 3.14.2 - winston-transport: 4.7.1 + winston: 3.15.0 + winston-transport: 4.8.0 ws: 7.5.10 - yaml: 2.5.1 + yaml: 2.6.0 transitivePeerDependencies: - bufferutil - encoding @@ -4280,13 +4430,14 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - form-data@2.5.1: + form-data@2.5.2: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + safe-buffer: 5.2.1 - form-data@4.0.0: + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -4389,7 +4540,7 @@ snapshots: dependencies: ini: 2.0.0 - google-auth-library@9.14.1(encoding@0.1.13): + google-auth-library@9.14.2(encoding@0.1.13): dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 @@ -4403,12 +4554,12 @@ snapshots: google-gax@4.4.1(encoding@0.1.13): dependencies: - '@grpc/grpc-js': 1.11.3 + '@grpc/grpc-js': 1.12.2 '@grpc/proto-loader': 0.7.13 '@types/long': 4.0.2 abort-controller: 3.0.0 duplexify: 4.1.3 - google-auth-library: 9.14.1(encoding@0.1.13) + google-auth-library: 9.14.2(encoding@0.1.13) node-fetch: 2.7.0(encoding@0.1.13) object-hash: 3.0.0 proto3-json-serializer: 2.0.2 @@ -4423,7 +4574,7 @@ snapshots: dependencies: extend: 3.0.2 gaxios: 6.7.1(encoding@0.1.13) - google-auth-library: 9.14.1(encoding@0.1.13) + google-auth-library: 9.14.2(encoding@0.1.13) qs: 6.13.0 url-template: 2.0.8 uuid: 9.0.1 @@ -4475,7 +4626,7 @@ snapshots: '@types/hast': 3.0.4 devlop: 1.1.0 hast-util-from-parse5: 8.0.1 - parse5: 7.1.2 + parse5: 7.2.0 vfile: 6.0.3 vfile-message: 4.0.2 @@ -4502,7 +4653,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hast-util-select@6.0.2: + hast-util-select@6.0.3: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 @@ -4512,9 +4663,8 @@ snapshots: devlop: 1.1.0 direction: 2.0.1 hast-util-has-property: 3.0.0 - hast-util-to-string: 3.0.0 + hast-util-to-string: 3.0.1 hast-util-whitespace: 3.0.0 - not: 0.1.0 nth-check: 2.1.1 property-information: 6.5.0 space-separated-tokens: 2.0.2 @@ -4535,7 +4685,7 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-string@3.0.0: + hast-util-to-string@3.0.1: dependencies: '@types/hast': 3.0.4 @@ -4570,7 +4720,7 @@ snapshots: entities: 4.5.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.34.0 + terser: 5.36.0 html-void-elements@3.0.0: {} @@ -4654,7 +4804,7 @@ snapshots: ansi-escapes: 4.3.2 figures: 3.2.0 inquirer: 8.2.6 - picocolors: 1.1.0 + picocolors: 1.1.1 run-async: 2.4.1 rxjs: 7.8.1 @@ -4889,7 +5039,7 @@ snapshots: dependencies: uc.micro: 2.1.0 - liquidjs@10.17.0: + liquidjs@10.18.0: dependencies: commander: 10.0.1 @@ -4941,7 +5091,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.7.0 + tslib: 2.8.0 lru-cache@10.4.3: {} @@ -5175,7 +5325,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nan@2.20.0: + nan@2.22.0: optional: true nearley@2.20.1: @@ -5194,7 +5344,9 @@ snapshots: no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.7.0 + tslib: 2.8.0 + + node-addon-api@7.1.1: {} node-emoji@2.1.3: dependencies: @@ -5227,7 +5379,7 @@ snapshots: node-retrieve-globals@6.0.0: dependencies: - acorn: 8.12.1 + acorn: 8.13.0 acorn-walk: 8.3.4 esm-import-transformer: 3.0.2 @@ -5238,8 +5390,6 @@ snapshots: normalize-path@3.0.0: {} - not@0.1.0: {} - nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -5290,7 +5440,7 @@ snapshots: oniguruma-to-js@0.4.3: dependencies: - regex: 4.3.2 + regex: 4.3.3 open@6.4.0: dependencies: @@ -5298,7 +5448,7 @@ snapshots: openapi3-ts@3.2.0: dependencies: - yaml: 2.5.1 + yaml: 2.6.0 ora@5.4.1: dependencies: @@ -5350,7 +5500,7 @@ snapshots: param-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.0 parse-srcset@1.0.2: {} @@ -5362,7 +5512,7 @@ snapshots: parse5@6.0.1: {} - parse5@7.1.2: + parse5@7.2.0: dependencies: entities: 4.5.0 @@ -5371,7 +5521,7 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.0 path-key@2.0.1: {} @@ -5425,7 +5575,7 @@ snapshots: dependencies: split2: 4.2.0 - picocolors@1.1.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -5511,7 +5661,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.7.3 + '@types/node': 22.7.6 long: 5.2.3 proxy-addr@2.0.7: @@ -5585,7 +5735,7 @@ snapshots: re2@1.21.4: dependencies: install-artifact-from-github: 1.3.5 - nan: 2.20.0 + nan: 2.22.0 node-gyp: 10.2.0 transitivePeerDependencies: - supports-color @@ -5623,9 +5773,9 @@ snapshots: dependencies: picomatch: 2.3.1 - readdirp@4.0.1: {} + readdirp@4.0.2: {} - regex@4.3.2: {} + regex@4.3.3: {} registry-auth-token@5.0.2: dependencies: @@ -5688,7 +5838,7 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.7.0 + tslib: 2.8.0 safe-buffer@5.1.2: {} @@ -5698,8 +5848,9 @@ snapshots: safer-buffer@2.1.2: {} - sass@1.79.3: + sass@1.80.2: dependencies: + '@parcel/watcher': 2.4.1 chokidar: 4.0.1 immutable: 4.3.7 source-map-js: 1.2.1 @@ -5739,6 +5890,24 @@ snapshots: transitivePeerDependencies: - supports-color + send@0.19.1: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + serve-static@1.16.2: dependencies: encodeurl: 2.0.0 @@ -5771,13 +5940,13 @@ snapshots: shebang-regex@3.0.0: {} - shiki@1.19.0: + shiki@1.22.0: dependencies: - '@shikijs/core': 1.19.0 - '@shikijs/engine-javascript': 1.19.0 - '@shikijs/engine-oniguruma': 1.19.0 - '@shikijs/types': 1.19.0 - '@shikijs/vscode-textmate': 9.2.2 + '@shikijs/core': 1.22.0 + '@shikijs/engine-javascript': 1.22.0 + '@shikijs/engine-oniguruma': 1.22.0 + '@shikijs/types': 1.22.0 + '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 side-channel@1.0.6: @@ -5839,7 +6008,7 @@ snapshots: sprintf-js@1.1.3: {} - sql-formatter@15.4.2: + sql-formatter@15.4.3: dependencies: argparse: 2.0.1 get-stdin: 8.0.0 @@ -5921,7 +6090,7 @@ snapshots: superstatic@9.0.3(encoding@0.1.13): dependencies: - basic-auth-connect: 1.0.0 + basic-auth-connect: 1.1.0 commander: 10.0.1 compression: 1.7.4 connect: 3.7.0 @@ -5987,10 +6156,10 @@ snapshots: - encoding - supports-color - terser@5.34.0: + terser@5.36.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.12.1 + acorn: 8.13.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -6037,7 +6206,9 @@ snapshots: triple-beam@1.4.1: {} - tslib@2.7.0: {} + tslib@2.8.0: {} + + tsscmp@1.0.6: {} type-fest@0.20.2: {} @@ -6201,13 +6372,13 @@ snapshots: dependencies: string-width: 4.2.3 - winston-transport@4.7.1: + winston-transport@4.8.0: dependencies: logform: 2.6.1 - readable-stream: 3.6.2 + readable-stream: 4.5.2 triple-beam: 1.4.1 - winston@3.14.2: + winston@3.15.0: dependencies: '@colors/colors': 1.6.0 '@dabh/diagnostics': 2.0.3 @@ -6219,7 +6390,7 @@ snapshots: safe-stable-stringify: 2.5.0 stack-trace: 0.0.10 triple-beam: 1.4.1 - winston-transport: 4.7.1 + winston-transport: 4.8.0 wrap-ansi@6.2.0: dependencies: @@ -6260,7 +6431,7 @@ snapshots: yallist@4.0.0: {} - yaml@2.5.1: {} + yaml@2.6.0: {} yargs-parser@20.2.9: {} diff --git a/site-shared b/site-shared index 61010ce573..99868e7cb7 160000 --- a/site-shared +++ b/site-shared @@ -1 +1 @@ -Subproject commit 61010ce5737e4bd0bc739c734ad8d44260fefe8a +Subproject commit 99868e7cb71e2109d7547bc1ecdad2813b86b6ca diff --git a/src/_11ty/plugins/highlight.js b/src/_11ty/plugins/highlight.js index 194294bfbd..56325784d1 100644 --- a/src/_11ty/plugins/highlight.js +++ b/src/_11ty/plugins/highlight.js @@ -101,8 +101,9 @@ function _highlight( if (language.includes('dartpad')) { const theme = attributes['theme'] ?? 'light'; const title = attributes['title'] ?? 'Runnable Flutter sample'; + const height = attributes['height']; const runAutomatically = attributes['run'] ?? 'false'; - return `
${markdown.utils.escapeHtml(content)}
`; + return `
${markdown.utils.escapeHtml(content)}
`; } const showLineNumbers = 'showLineNumbers' in attributes; diff --git a/src/_11ty/utils/slugify.js b/src/_11ty/utils/slugify.js index 2d18cc0ddc..8e9c8b0e26 100644 --- a/src/_11ty/utils/slugify.js +++ b/src/_11ty/utils/slugify.js @@ -13,6 +13,7 @@ export function slugify(text) { return text .toLowerCase() .trim() + .replace(/\+/g, 'plus') .replace(/[:.]/g, '-') .replace(/[^\p{L}\p{N}\s:._-]/gu, '') .replace(/[\s-]+/g, '-') diff --git a/src/_data/devtools_releases.yml b/src/_data/devtools_releases.yml index c607f69571..c55fcaf222 100644 --- a/src/_data/devtools_releases.yml +++ b/src/_data/devtools_releases.yml @@ -2,6 +2,7 @@ # make sure to add the version number as an entry in this list. # This step might be eliminated in the future. releases: + - '2.40.1' - '2.39.0' - '2.38.0' - '2.37.2' diff --git a/src/_data/platforms.yml b/src/_data/platforms.yml index 99878fede1..a9caf42063 100644 --- a/src/_data/platforms.yml +++ b/src/_data/platforms.yml @@ -1,50 +1,50 @@ - platform: 'Android SDK' - chipsets: 'x64, Arm32, Arm64' + target-arch: 'x64, Arm32, Arm64' supported: '21 to 34' - besteffort: 'N/A' + ci-tested: '21 to 34' unsupported: '20 and earlier' - platform: 'iOS' - chipsets: 'Arm64' - supported: '17' - besteffort: '12 to 16, 18' + target-arch: 'Arm64' + supported: '12 to 18' + ci-tested: '17' unsupported: '11 and earlier' - platform: 'macOS' - chipsets: 'x64, Arm64' - supported: '13, 14' - besteffort: '10.14 to 12, 15' - unsupported: '10.13 and earlier' + target-arch: 'x64, Arm64' + supported: 'Mojave (10.14) to Sequoia (15)' + ci-tested: 'Ventura (13), Sonoma (14)' + unsupported: 'High Sierra (10.13) and earlier' - platform: 'Windows' - chipsets: 'x64, Arm64' - supported: '10' - besteffort: '11' + target-arch: 'x64, Arm64' + supported: '10, 11' + ci-tested: '10' unsupported: '8 and earlier' - platform: 'Debian (Linux)' - chipsets: 'x64, Arm64' - supported: '11, 12' - besteffort: '10' + target-arch: 'x64, Arm64' + supported: '10, 11, 12' + ci-tested: '11, 12' unsupported: '9 and earlier' - platform: 'Ubuntu (Linux)' - chipsets: 'x64, Arm64' - supported: '20.04 LTS, 22.04 LTS' - besteffort: '24.04 LTS' + target-arch: 'x64, Arm64' + supported: '20.04 LTS to 24.04 LTS' + ci-tested: '20.04 LTS, 22.04 LTS' unsupported: '23.10 and earlier non-LTS' - platform: 'Chrome (Web)' - chipsets: 'N/A' + target-arch: 'JavaScript, WebAssembly' supported: '[Latest 2](https://chromereleases.googleblog.com/search/label/Stable%20updates)' - besteffort: '96 to latest 2' + ci-tested: '119, 125' unsupported: '95 and earlier' - platform: 'Firefox (Web)' - chipsets: 'N/A' - supported: '[Latest 2](https://www.mozilla.org/en-US/firefox/releases/)' - besteffort: '99 to latest 2' + target-arch: 'JavaScript' + supported: '106 and newer' + ci-tested: '106' unsupported: '98 and earlier' - platform: 'Safari (Web)' - chipsets: 'N/A' - supported: '[Latest 2](https://developer.apple.com/documentation/safari-release-notes/)' - besteffort: '15.6 to latest 2' + target-arch: 'JavaScript' + supported: '15.6 and newer' + ci-tested: '15.6' unsupported: '15.5 and earlier' - platform: 'Edge (Web)' - chipsets: 'N/A' + target-arch: 'JavaScript, WebAssembly' supported: '[Latest 2](https://learn.microsoft.com/en-us/deployedge/microsoft-edge-relnote-stable-channel)' - besteffort: '96 to latest 2' + ci-tested: 119, 125 unsupported: '95 and earlier' diff --git a/src/_data/sidenav.yml b/src/_data/sidenav.yml index 2f3f298e19..6ebc5477e8 100644 --- a/src/_data/sidenav.yml +++ b/src/_data/sidenav.yml @@ -1,4 +1,5 @@ - header: 开始使用 Flutter + - title: 安装和环境配置 permalink: /get-started/install @@ -28,18 +29,6 @@ - title: 本地数据与缓存 permalink: /get-started/fundamentals/local-caching - - title: Dart 语言 - permalink: /resources/bootstrap-into-dart - - - title: 编程练习 & 样例 - children: - - title: 编程练习 (Codelab) - permalink: /codelabs - - title: 实用教程 (Cookbook) - permalink: /cookbook - - title: GitHub 上的样例 - permalink: https://flutter.github.io/samples/ - - title: 拥有其他平台开发经验? permalink: /get-started/flutter-for children: @@ -60,6 +49,14 @@ - title: Flutter 对比 Swift 的并发 permalink: /get-started/flutter-for/dart-swift-concurrency + - divider + - title: 编程练习 (Codelab) + permalink: /codelabs + - title: 实用教程 (Cookbook) + permalink: /cookbook + - title: GitHub 上的样例 + permalink: https://flutter.github.io/samples/ + - title: 保持版本更新 permalink: /release children: @@ -114,13 +111,13 @@ - title: 添加多人游戏支持 permalink: /cookbook/games/firestore-multiplayer - title: 添加应用内购功能 - permalink: https://codelabs.developers.google.com/codelabs/flutter-in-app-purchases + permalink: https://codelabs.developers.google.cn/codelabs/flutter-in-app-purchases - title: 添加用户身份验证 permalink: https://firebase.google.cn/codelabs/firebase-auth-in-flutter-apps - title: 使用 Crashlytics 调试 permalink: https://firebase.google.cn/docs/crashlytics/get-started?platform=flutter - title: Flutter Flame 入门 - permalink: https://codelabs.developers.google.com/codelabs/flutter-flame-brick-breaker + permalink: https://codelabs.developers.google.cn/codelabs/flutter-flame-brick-breaker - title: 盈利 children: - title: 广告 @@ -130,9 +127,9 @@ - title: 添加广告 permalink: /cookbook/plugins/google-mobile-ads - title: 在 Flutter 应用中添加 AdMob 广告 - permalink: https://codelabs.developers.google.com/codelabs/admob-ads-in-flutter + permalink: https://codelabs.developers.google.cn/codelabs/admob-ads-in-flutter - title: 添加 AdMob 横幅广告和原生内嵌广告 - permalink: https://codelabs.developers.google.com/codelabs/admob-inline-ads-in-flutter + permalink: https://codelabs.developers.google.cn/codelabs/admob-inline-ads-in-flutter - title: AdMob 中介广告变现 permalink: https://developers.google.cn/admob/flutter/mediation - title: 交互式媒体广告插件 @@ -142,7 +139,7 @@ - title: 应用内购功能概览 permalink: /resources/in-app-purchases-overview - title: 添加应用内购功能 - permalink: https://codelabs.developers.google.com/codelabs/flutter-in-app-purchases + permalink: https://codelabs.developers.google.cn/codelabs/flutter-in-app-purchases - title: 支付 children: - title: 支付概览 @@ -151,10 +148,10 @@ permalink: https://pub-web.flutter-io.cn/packages/pay - title: 地图 children: - - title: 为应用程序添加地图 + - title: 为应用程序添加 Google 地图 + permalink: https://codelabs.developers.google.cn/codelabs/google-maps-in-flutter + - title: Google 地图 package 文档 permalink: https://developers.google.cn/maps/flutter-package - - title: 在 Flutter 应用中添加 Google 地图 - permalink: https://codelabs.developers.google.com/codelabs/google-maps-in-flutter - title: 新闻 children: - title: 构建新闻应用 @@ -166,7 +163,7 @@ permalink: /ui - title: Widget 目录 permalink: /ui/widgets -- title: 布局构建 +- title: 布局 permalink: /ui/layout children: - title: 概览 @@ -424,7 +421,7 @@ - title: 概览 permalink: /data-and-backend/firebase - title: 将 Firebase 添加到 Flutter 应用中 - permalink: https://firebase.google.cn/docs/flutter/setup?platform=ios + permalink: https://firebase.google.cn/docs/flutter/setup - title: Google APIs permalink: /data-and-backend/google-apis @@ -452,6 +449,8 @@ permalink: /platform-integration/android/c-interop - title: 托管 Android 原生视图 permalink: /platform-integration/android/platform-views + - title: 启动 Jetpack Compose Activity + permalink: /platform-integration/android/compose-activity - title: 在 Android 上恢复状态 permalink: /platform-integration/android/restore-state-android - title: 构建适合 Chrome OS 的 Android 应用 @@ -463,6 +462,8 @@ permalink: /platform-integration/ios/ios-latest - title: 将 iOS 添加为构建目标 permalink: /platform-integration/ios/install-ios + - title: 最新 iOS 版本上的 Flutter + permalink: /platform-integration/ios/ios-latest - title: 使用 Apple 的系统库 permalink: /platform-integration/ios/apple-frameworks - title: 添加启动页 @@ -504,7 +505,7 @@ permalink: /platform-integration/web/install-web - title: 构建一个 Web 应用 permalink: /platform-integration/web/building - - title: WebAssembly + - title: 编译为 WebAssembly permalink: /platform-integration/web/wasm - title: 自定义 Web 应用初始化 permalink: /platform-integration/web/initialization @@ -760,7 +761,7 @@ - title: 开发者资源列表 permalink: /resources children: - - header: 学习 +# - header: Learn - title: 常见问题解答 permalink: /resources/faq - title: 相关书籍 @@ -773,23 +774,23 @@ permalink: /resources/bootstrap-into-dart - title: 获取支持和帮助 permalink: /resources/support - - header: 贡献 - - title: 创建有效的 Bug 报告 - permalink: /resources/bug-reports - - title: 为 Flutter 做出贡献 - permalink: https://github.com/flutter/flutter/blob/master/CONTRIBUTING.md - - title: 设计文档 - permalink: https://github.com/flutter/flutter/issues?q=is%3Aopen+is%3Aissue+label%3A%22design+doc%22 - -- title: 更多资料 - permalink: /reference - expanded: true - children: - - title: 了解 Dash - permalink: /dash - - title: Flutter Widget 列表 - permalink: /reference/widgets - - title: Flutter API 文档 - permalink: https://api.flutter-io.cn - - title: Flutter 命令行文档 - permalink: /reference/flutter-cli + - divider + - title: 贡献 + children: + - title: 创建有效的 Bug 报告 + permalink: /resources/bug-reports + - title: 为 Flutter 做出贡献 + permalink: https://github.com/flutter/flutter/blob/main/CONTRIBUTING.md + - title: 了解提议的功能 + permalink: /resources/design-docs + - title: 参考资料 + permalink: /reference + children: + - title: 了解 Dash + permalink: /dash + - title: Flutter Widget 列表 + permalink: /reference/widgets + - title: Flutter 命令行文档 + permalink: /reference/flutter-cli + - title: Flutter API 文档 + permalink: https://api.flutter-io.cn diff --git a/src/_data/site.yml b/src/_data/site.yml index 9430fdf9e2..62666fec0e 100644 --- a/src/_data/site.yml +++ b/src/_data/site.yml @@ -81,7 +81,7 @@ appmin: android_sdk: 21 powershell: 5.0 xcode: '14' - cocoapods: '1.10' + cocoapods: '1.16' devmin: windows: '64-bit version of Microsoft Windows 10' macos: '11 (Big Sur)' @@ -108,13 +108,4 @@ appnow: powershell: 5.1 xcode: '15' ios: '17' - cocoapods: '1.15' - -########### Custom ########### - -custom: - dartpad: - embed-dart-prefix: https://dartpad.cn/embed-dart.html - embed-flutter-prefix: https://dartpad.cn/embed-flutter.html - embed-html-prefix: https://dartpad.cn/embed-html.html - embed-inline-prefix: https://dartpad.cn/embed-inline.html + cocoapods: '1.16' diff --git a/src/_includes/docs/add-to-app/ios-project/embed-cocoapods.md b/src/_includes/docs/add-to-app/ios-project/embed-cocoapods.md index eb025cce77..c674a9dd8d 100644 --- a/src/_includes/docs/add-to-app/ios-project/embed-cocoapods.md +++ b/src/_includes/docs/add-to-app/ios-project/embed-cocoapods.md @@ -54,13 +54,9 @@ This section presumes you called your Swift app `MyApp`. navigate to the root of your app directory. Use the `pod init` command to create the `Podfile` file. - :::warning - CocoaPods (as of version 1.15.2) does not support Xcode 16. - If the `pod init` command errors, consider re-creating your Xcode project - using Xcode 15 or older. - - To learn more about the CocoaPods issue, check out - [CocoaPods#12456](https://github.com/CocoaPods/CocoaPods/issues/12456). + :::tip + If the `pod init` command errors, + check that you're on the latest version of CocoaPods. ::: 1. Update your `Podfile` config file. diff --git a/src/_includes/docs/community/china/os-settings.md b/src/_includes/docs/community/china/os-settings.md index 87797324fa..7011aa5ee7 100644 --- a/src/_includes/docs/community/china/os-settings.md +++ b/src/_includes/docs/community/china/os-settings.md @@ -13,10 +13,10 @@ {% capture newdir -%}{{prompt}} New-Item -Path '{{installdirsuggestion}}' -ItemType Directory{% endcapture -%} {% capture unzip -%} {{prompt}} Expand-Archive .\{% endcapture -%} {% capture permaddexample -%} -$newPath = $pwd.PATH + "/flutter/bin",$env:PATH -join ";" -[System.Environment]::SetEnvironmentVariable('Path',$newPath,User) -[System.Environment]::SetEnvironmentVariable('PUB_HOSTED_URL','https://pub.flutter-io.cn',User) -[System.Environment]::SetEnvironmentVariable('FLUTTER_STORAGE_BASE_URL','https://storage.flutter-io.cn',User) +$newPath = "$pwd\flutter\bin;$env:PATH" +[System.Environment]::SetEnvironmentVariable('Path', $newPath, 'User') +[System.Environment]::SetEnvironmentVariable('PUB_HOSTED_URL', 'https://pub.flutter-io.cn', 'User') +[System.Environment]::SetEnvironmentVariable('FLUTTER_STORAGE_BASE_URL', 'https://storage.flutter-io.cn', 'User') {% endcapture -%} {% else -%} {% assign shell = 'terminal' -%} diff --git a/src/_includes/docs/install/compiler/android.md b/src/_includes/docs/install/compiler/android.md index 15ea574886..b7222e3d61 100644 --- a/src/_includes/docs/install/compiler/android.md +++ b/src/_includes/docs/install/compiler/android.md @@ -264,7 +264,7 @@ location of your Java installation. Android sdkmanager tool was found, but failed to run (/Users/atsansone/Library/Android/sdk/cmdline-tools/latest/bin/sdkmanager): "exited code 1". Try re-installing or updating your Android SDK, -visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions. +visit https://flutter.dev/to/macos-android-setup for detailed instructions. ``` The `flutter doctor` command returns this error because of how the `JAVA_HOME` diff --git a/src/_includes/docs/install/reqs/linux/software.md b/src/_includes/docs/install/reqs/linux/software.md index 612def5419..c575301400 100644 --- a/src/_includes/docs/install/reqs/linux/software.md +++ b/src/_includes/docs/install/reqs/linux/software.md @@ -24,16 +24,14 @@ To develop Flutter on {{include.os}}: 1. To develop {{include.target}} apps: {:type="a"} - 1. Install the following prerequisite packages for Android Studio. + 1. Install the following prerequisite packages for Android Studio: ```console - $ sudo apt-get install \ - libc6:amd64 libstdc++6:amd64 \ - libbz2-1.0:amd64 libncurses5:amd64 + $ sudo apt-get install libc6:amd64 libstdc++6:amd64 lib32z1 libbz2-1.0:amd64 ``` - 1. Install [Android Studio][] {{site.appmin.android_studio}} or later to debug and compile - Java or Kotlin code for Android. + 1. Install [Android Studio][] {{site.appmin.android_studio}} or later to + debug and compile Java or Kotlin code for Android. Flutter requires the full version of Android Studio. {% when 'Web' -%} diff --git a/src/_includes/docs/install/test-drive/vscode.md b/src/_includes/docs/install/test-drive/vscode.md index 595fc9abe2..5a9cb46e71 100644 --- a/src/_includes/docs/install/test-drive/vscode.md +++ b/src/_includes/docs/install/test-drive/vscode.md @@ -6,7 +6,7 @@ [Flutter extension](https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter). This also automatically installs the [Dart extension](https://marketplace.visualstudio.com/items?itemName=Dart-Code.dart-code). - With these extensions, you can debug you application. + With these extensions, you can debug your application. 2. Open the Command Palette. diff --git a/src/_includes/docs/swift-package-manager/migrate-swift-plugin.md b/src/_includes/docs/swift-package-manager/migrate-swift-plugin.md index 4ad8548e0c..e3043a6df1 100644 --- a/src/_includes/docs/swift-package-manager/migrate-swift-plugin.md +++ b/src/_includes/docs/swift-package-manager/migrate-swift-plugin.md @@ -181,7 +181,7 @@ The example below uses `ios`, replace `ios` with `macos`/`darwin` as applicable. Verify Xcode doesn't produce any warnings or errors for this file. :::tip - If Xcode doen't show any files, quit Xcode (**Xcode > Quit Xcode**) and + If Xcode doesn't show any files, quit Xcode (**Xcode > Quit Xcode**) and reopen. If Xcode doesn't update after you make a change, try clicking diff --git a/src/_sass/base/_variables.scss b/src/_sass/base/_variables.scss index 317033e806..402ab6a5fd 100644 --- a/src/_sass/base/_variables.scss +++ b/src/_sass/base/_variables.scss @@ -1,3 +1,5 @@ +@use 'sass:color'; + // Colors $flutter-color-blue: #043875; $flutter-color-teal: #158477; @@ -18,7 +20,7 @@ $site-color-light-grey: #DADCE0; $site-color-sub-grey: #8d9399; $site-color-nav-links: #6E7274; $site-color-body: #212121; // Poor contrast with links -$site-color-body-light: rgba(0, 0, 0, .8); +$site-color-body-light: color.scale($site-color-body, $lightness: 20%); $site-color-footer: #303c42; $site-color-primary: $flutter-color-blue-500; $twitter-color: #60CAF6; @@ -36,7 +38,7 @@ $site-header-height: 66px; $site-footer-md-default-height: 140px; $site-content-top-padding: 40px; $site-content-max-width: 960px; -$site-sidebar-top-padding: 24px; +$site-sidebar-top-padding: 16px; $site-sidebar-side-padding: 16px; $site-nav-mobile-side-padding: 20px; $site-spacer: 1rem; diff --git a/src/_sass/components/_code.scss b/src/_sass/components/_code.scss index a916be1396..9f90cf2f02 100644 --- a/src/_sass/components/_code.scss +++ b/src/_sass/components/_code.scss @@ -187,6 +187,8 @@ pre { border-bottom: 1px solid $flutter-color-grey-500; font-size: 0.9375rem; font-weight: 500; + overflow-x: hidden; + text-overflow: ellipsis; padding: 0.75rem 0.5rem 0.67rem 1rem; } diff --git a/src/_sass/components/_sidebar.scss b/src/_sass/components/_sidebar.scss index bb8dd52025..ab9c420e1a 100644 --- a/src/_sass/components/_sidebar.scss +++ b/src/_sass/components/_sidebar.scss @@ -1,3 +1,5 @@ +@use 'sass:color'; + @use '../base/variables' as *; @use '../vendor/bootstrap'; @@ -60,7 +62,7 @@ font-weight: bootstrap.$font-weight-bolder; font-size: bootstrap.$font-size-base; user-select: none; - color: lighten($site-color-body-light, 20%); + color: color.scale($site-color-body-light, $lightness: 15%); } .nav-link { @@ -104,6 +106,10 @@ padding: 0 $site-sidebar-side-padding; } + > .nav-header:first-child { + padding-top: 0; + } + > .nav-item { > .nav-link { @include nav-link-active-style; diff --git a/src/content/add-to-app/android/add-flutter-screen.md b/src/content/add-to-app/android/add-flutter-screen.md index b6cfd57c09..28c281f3b2 100644 --- a/src/content/add-to-app/android/add-flutter-screen.md +++ b/src/content/add-to-app/android/add-flutter-screen.md @@ -87,6 +87,24 @@ import io.flutter.embedding.android.FlutterActivity; ::: {% tabs "android-language" %} +{% tab "Jetpack Compose" %} + +```kotlin title="ExistingActivity.kt" +MyButton(onClick = { + startActivity( + FlutterActivity.createDefaultIntent(this) + ) +}) + +@Composable +fun MyButton(onClick: () -> Unit) { + Button(onClick = onClick) { + Text("Launch Flutter!") + } +} +``` + +{% endtab %} {% tab "Kotlin" %} ```kotlin title="ExistingActivity.kt" @@ -127,6 +145,27 @@ Dart 代码入口不能通过 `Intent` 改变,但是初始路由可以通过 ` 下面的例子讲解了如何打开一个自定义 Flutter 初始路由的 `FlutterActivity`。 {% tabs "android-language" %} +{% tab "Jetpack Compose" %} + +```kotlin title="ExistingActivity.kt" +MyButton(onClick = { + startActivity( + FlutterActivity + .withNewEngine() + .initialRoute("/my_route") + .build(this) + ) +}) + +@Composable +fun MyButton(onClick: () -> Unit) { + Button(onClick = onClick) { + Text("Launch Flutter!") + } +} +``` + +{% endtab %} {% tab "Kotlin" %} ```kotlin title="ExistingActivity.kt" diff --git a/src/content/add-to-app/android/project-setup.md b/src/content/add-to-app/android/project-setup.md index c3a7d0a6ba..36fe6b3ecc 100644 --- a/src/content/add-to-app/android/project-setup.md +++ b/src/content/add-to-app/android/project-setup.md @@ -432,7 +432,24 @@ so that it includes the local repository and the dependency: 为此,需要在宿主应用程序中修改 `settings.gradle` 文件, 使其包含本地存储库和上述依赖项: -```groovy +{% tabs "settings.gradle.kts" %} +{% tab "Kotlin" %} + +```kotlin title="settings.gradle.kts" +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) + repositories { + google() + mavenCentral() + maven("https://storage.googleapis.com/download.flutter.io") + } +} +``` + +{% endtab %} +{% tab "Groovy" %} + +```groovy title="settings.gradle" dependencyResolutionManagement { repositoriesMode = RepositoriesMode.PREFER_SETTINGS repositories { @@ -454,6 +471,9 @@ dependencyResolutionManagement { } ``` +{% endtab %} +{% endtabs %} +
### Kotlin DSL based Android Project @@ -575,20 +595,52 @@ Include this project in the host app's `settings.gradle` file. ::: +#### Updating `settings.gradle` + +#### 更新 `settings.gradle` + Include the Flutter module as a subproject in the host app's `settings.gradle`. This example assumes `flutter_module` and `MyApp` exist in the same directory -将 Flutter 模块作为子项目添加到宿主应用的 `settings.gradle` 中: +将 Flutter 模块作为子项目添加到宿主应用的 `settings.gradle` 中。 +本示例假定 `flutter_module` 和 `MyApp` 在同一目录中: + +If you are using Kotlin, apply the following changes: + +如果你使用 Kotlin,请进行以下更改: + +```kotlin title="MyApp/settings.gradle.kts" +// Include the host app project. Assumed existing content. +include(":app") +// Replace "flutter_module" with whatever package_name you supplied when you ran: +// `$ flutter create -t module [package_name] +val filePath = settingsDir.parentFile.toString() + "/flutter_module/.android/include_flutter.groovy" +apply(from = File(filePath)) +``` + +:::note + +The ability to invoke `include_flutter.groovy` from Kotlin code requires Flutter 3.27. +To determine your current Flutter version, run `flutter --version`. If it is not +at least version 3.27, consider changing to either the `master` or `beta` channels. + +从 Kotlin 代码中调用 `include_flutter.groovy` 的功能需要 Flutter 3.27。 +你如果需要判断当前的 Flutter 版本,请运行 `flutter --version`。 +如果低于 3.27 版本,请考虑更换到 `master` 或 `beta` 渠道版本。 + +::: + +If you are using Groovy, apply the following changes: + +如果你使用 Groovy,请进行以下更改: ```groovy title="MyApp/settings.gradle" // Include the host app project. include(":app") // assumed existing content -setBinding(new Binding([gradle: this])) // new -evaluate(new File( // new - settingsDir.parentFile, // new - 'flutter_module/.android/include_flutter.groovy' // new -)) // new +setBinding(new Binding([gradle: this])) // new +def filePath = settingsDir.parentFile.toString() + "/flutter_module/.android/include_flutter.groovy" // new +apply from: filePath // new ``` The binding and script evaluation allows the Flutter @@ -600,10 +652,14 @@ binding 和 evaluation 脚本可以使 Flutter 模块将其自身(如 `:flutte 该模块使用的所有 Flutter 插件(如 `:package_info`,`:video_player`) 都包含在 `settings.gradle` 的评估的上下文中。 +#### Updating `app/build.gradle` + +#### 更新 `app/build.gradle` + Introduce an `implementation` dependency on the Flutter module from your app: -在你的应用中引入对 Flutter 模块的依赖: +在你的应用中引入对 Flutter 模块的 `implementation` 依赖: ```groovy title="MyApp/app/build.gradle" dependencies { @@ -611,6 +667,14 @@ dependencies { } ``` +:::note + +This code is identical between Groovy and Kotlin. + +Groovy 和 Kotlin 的代码完全相同。 + +::: + {% endtab %} {% endtabs %} diff --git a/src/content/assets/images/docs/fwe/dash-search.png b/src/content/assets/images/docs/fwe/dash-search.png new file mode 100644 index 0000000000..a631bce4bd Binary files /dev/null and b/src/content/assets/images/docs/fwe/dash-search.png differ diff --git a/src/content/assets/js/inject_dartpad.js b/src/content/assets/js/inject_dartpad.js index ab2d80abee..6780dda3c0 100644 --- a/src/content/assets/js/inject_dartpad.js +++ b/src/content/assets/js/inject_dartpad.js @@ -53,14 +53,14 @@ return{inherit:inherit,inheritMany:inheritMany,mixin:mixinEasy,mixinHard:mixinHa function initializeDeferredHunk(a){x=v.types.length a(hunkHelpers,v,w,$)}var J={ uM(a,b,c,d){return{i:a,p:b,e:c,x:d}}, -ks(a){var t,s,r,q,p,o=a[v.dispatchPropertyName] +M3(a){var t,s,r,q,p,o=a[v.dispatchPropertyName] if(o==null)if($.Bv==null){A.XD() o=a[v.dispatchPropertyName]}if(o!=null){t=o.p if(!1===t)return o.i if(!0===t)return a s=Object.getPrototypeOf(a) if(t===s)return o.i -if(o.e===s)throw A.Og(A.SY("Return interceptor for "+A.Ej(t(a,o))))}r=a.constructor +if(o.e===s)throw A.Og(A.SY("Return interceptor for "+A.I(t(a,o))))}r=a.constructor if(r==null)q=null else{p=$.zm if(p==null)p=$.zm=v.getIsolateTag("_$dart_js") @@ -75,10 +75,7 @@ if(typeof r=="function"){p=$.zm if(p==null)p=$.zm=v.getIsolateTag("_$dart_js") Object.defineProperty(r,p,{value:B.vB,enumerable:false,writable:true,configurable:true}) return B.vB}return B.vB}, -Ep(a){a.fixed$length=Array -return a}, -un(a){a.fixed$length=Array -a.immutable$list=Array +x(a){a.fixed$length=Array return a}, Ga(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 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 @@ -92,9 +89,9 @@ if(a==null)return a if(Array.isArray(a))return J.jd.prototype if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype if(typeof a=="symbol")return J.Dw.prototype -if(typeof a=="bigint")return J.yP.prototype +if(typeof a=="bigint")return J.rQ.prototype return a}if(a instanceof A.a)return a -return J.ks(a)}, +return J.M3(a)}, c(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.bU.prototype return J.kD.prototype}if(typeof a=="string")return J.Dr.prototype if(a==null)return J.CD.prototype @@ -102,31 +99,25 @@ if(typeof a=="boolean")return J.yE.prototype if(Array.isArray(a))return J.jd.prototype if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype if(typeof a=="symbol")return J.Dw.prototype -if(typeof a=="bigint")return J.yP.prototype +if(typeof a=="bigint")return J.rQ.prototype return a}if(a instanceof A.a)return a -return J.ks(a)}, -rY(a){if(typeof a=="string")return J.Dr.prototype -if(a==null)return a -if(!(a instanceof A.a))return J.kd.prototype -return a}, +return J.M3(a)}, w1(a){if(a==null)return a if(Array.isArray(a))return J.jd.prototype if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype if(typeof a=="symbol")return J.Dw.prototype -if(typeof a=="bigint")return J.yP.prototype +if(typeof a=="bigint")return J.rQ.prototype return a}if(a instanceof A.a)return a -return J.ks(a)}, -Av(a,b){return J.w1(a).Z(a,b)}, +return J.M3(a)}, CR(a){return J.c(a).gbx(a)}, -GE(a){return J.rY(a).OF(a)}, +GA(a,b){return J.w1(a).F(a,b)}, Hm(a){return J.U6(a).gB(a)}, -I(a){return J.w1(a).gkz(a)}, -Jy(a,b){return J.c(a).e7(a,b)}, M1(a,b,c){return J.w1(a).E2(a,b,c)}, -Nu(a){return J.c(a).giO(a)}, +Nu(a){return J.c(a).gi(a)}, cf(a,b){if(a==null)return b==null if(typeof a!="object")return b!=null&&a===b return J.c(a).DN(a,b)}, +p(a){return J.w1(a).gkz(a)}, t(a){return J.c(a)["["](a)}, vB:function vB(){}, yE:function yE(){}, @@ -136,7 +127,7 @@ zh:function zh(){}, iC:function iC(){}, kd:function kd(){}, c5:function c5(){}, -yP:function yP(){}, +rQ:function rQ(){}, Dw:function Dw(){}, jd:function jd(a){this.$ti=a}, Po:function Po(a){this.$ti=a}, @@ -150,17 +141,23 @@ qI:function qI(){}, bU:function bU(){}, kD:function kD(){}, Dr:function Dr(){}},A={FK:function FK(){}, +oo(a){var t,s=a^48 +if(s<=9)return s +t=a|32 +if(97<=t&&t<=102)return t-87 +return-1}, yc(a,b){a=a+b&536870911 a=a+((a&524287)<<10)&536870911 return a^a>>>6}, qL(a){a=a+((a&67108863)<<3)&536870911 a^=a>>>11 return a+((a&16383)<<15)&536870911}, -y(a){var t,s +ks(a){var t,s for(t=$.Qu.length,s=0;s").Kq(d).C("xy<1,2>")) return new A.i1(a,b,c.C("@<0>").Kq(d).C("i1<1,2>"))}, +Wp(){return new A.lj("No element")}, n:function n(a){this.a=a}, zl:function zl(){}, bQ:function bQ(){}, @@ -186,14 +183,13 @@ A8:function A8(a,b,c){this.a=a this.b=b this.$ti=c}, SU:function SU(){}, -wv:function wv(a){this.a=a}, -p(a){var t=v.mangledGlobalNames[a] +NQ(a){var t=v.mangledGlobalNames[a] if(t!=null)return t return"minified:"+a}, wV(a,b){var t if(b!=null){t=b.x if(t!=null)return t}return u.p.b(a)}, -Ej(a){var t +I(a){var t 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" @@ -208,77 +204,47 @@ a[s]=t}return t}, Hp(a,b){var t,s,r,q,p,o=null,n=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a) if(n==null)return o t=n[3] -if(b<2||b>36)throw A.Og(A.TE(b,2,36,"radix",o)) +if(b==null){if(t!=null)return parseInt(a,10) +if(n[2]!=null)return parseInt(a,16) +return o}if(b<2||b>36)throw A.Og(A.TE(b,2,36,"radix",o)) if(b===10&&t!=null)return parseInt(a,10) if(b<10||t==null){s=b<=10?47+b:86+b r=n[1] for(q=r.length,p=0;ps)return o}return parseInt(a,b)}, l(a){return A.H(a)}, H(a){var t,s,r,q -if(a instanceof A.a)return A.m(A.d(a),null) +if(a instanceof A.a)return A.m(A.z(a),null) t=J.c(a) if(t===B.Ok||t===B.Ub||u.o.b(a)){s=B.O4(a) if(s!=="Object"&&s!=="")return s r=a.constructor if(typeof r=="function"){q=r.name -if(typeof q=="string"&&q!=="Object"&&q!=="")return q}}return A.m(A.d(a),null)}, -ik(a){if(a==null||typeof a=="number"||A.rQ(a))return J.t(a) +if(typeof q=="string"&&q!=="Object"&&q!=="")return q}}return A.m(A.z(a),null)}, +i(a){if(a==null||typeof a=="number"||A.y(a))return J.t(a) if(typeof a=="string")return JSON.stringify(a) -if(a instanceof A.Tp)return a["["](0) -if(a instanceof A.S5)return a.k(!0) +if(a instanceof A.d)return a["["](0) +if(a instanceof A.M)return a.k(!0) return"Instance of '"+A.l(a)+"'"}, +fw(a,b,c){var t,s,r,q +if(c<=500&&b===0&&c===a.length)return String.fromCharCode.apply(null,a) +for(t=b,s="";t>>0,t&1023|56320)}}throw A.Og(A.TE(a,0,1114111,null,null))}, -zo(a,b,c){var t,s,r={} -r.a=0 -t=[] -s=[] -r.a=b.length -B.Nm.FV(t,b) -r.b="" -if(c!=null&&c.a!==0)c.aN(0,new A.Cj(r,s,t)) -return J.Jy(a,new A.LI(B.Te,0,t,s,0))}, -im(a,b,c){var t,s,r -if(Array.isArray(b))t=c==null||c.a===0 -else t=!1 -if(t){s=b.length -if(s===0){if(!!a.$0)return a.$0()}else if(s===1){if(!!a.$1)return a.$1(b[0])}else if(s===2){if(!!a.$2)return a.$2(b[0],b[1])}else if(s===3){if(!!a.$3)return a.$3(b[0],b[1],b[2])}else if(s===4){if(!!a.$4)return a.$4(b[0],b[1],b[2],b[3])}else if(s===5)if(!!a.$5)return a.$5(b[0],b[1],b[2],b[3],b[4]) -r=a[""+"$"+s] -if(r!=null)return r.apply(a,b)}return A.Tl(a,b,c)}, -Tl(a,b,c){var t,s,r,q,p,o,n,m,l,k,j,i,h=Array.isArray(b)?b:A.Y1(b,u.z),g=h.length,f=a.$R -if(go)return A.zo(a,h,null) -if(gf)return A.zo(a,h,c) -if(h===b)h=A.Y1(h,u.z) -m=Object.keys(r) -if(c==null)for(s=m.length,l=0;l>>0,t&1023|56320)}}throw A.Og(A.TE(a,0,1114111,null,null))}, HY(a,b){var t,s="index" if(!A.ok(b))return new A.AT(!0,b,s,null) t=J.Hm(a) if(b<0||b>=t)return A.xF(b,t,a,s) return new A.bJ(null,null,!0,b,s,"Value not in range")}, -Og(a){return A.j(new Error(),a)}, -j(a,b){var t +au(a,b,c){if(a>c)return A.TE(a,0,c,"start",null) +if(b!=null)if(bc)return A.TE(b,a,c,"end",null) +return new A.AT(!0,b,"end",null)}, +tL(a){return new A.AT(!0,a,null,null)}, +Og(a){return A.r(new Error(),a)}, +r(a,b){var t if(b==null)b=new A.E() a.dartException=b t=A.J @@ -286,8 +252,8 @@ if("defineProperty" in Object){Object.defineProperty(a,"message",{get:t}) a.name=""}else a.toString=t return a}, J(){return J.t(this.dartException)}, -vh(a){throw A.Og(a)}, -A(a,b){throw A.j(b,a)}, +v(a){throw A.Og(a)}, +A(a,b){throw A.r(b,a)}, G(a){throw A.Og(A.a4(a))}, CU(a){if(a==null)return J.Nu(a) if(typeof a=="object")return A.eQ(a) @@ -296,9 +262,9 @@ dJ(a,b){var t,s,r,q=a.length for(t=0;t=0}, S0:function S0(a,b){this.a=a this.b=b}, -PD:function PD(a,b){this.a=a -this.$ti=b}, -ys:function ys(){}, -LP:function LP(a,b,c){this.a=a -this.b=b -this.$ti=c}, -Ku:function Ku(a,b){this.a=a -this.$ti=b}, -vI:function vI(a,b,c){var _=this -_.a=a -_.b=b -_.c=0 -_.d=null -_.$ti=c}, -LI:function LI(a,b,c,d,e){var _=this -_.a=a -_.c=b -_.d=c -_.e=d -_.f=e}, -Cj:function Cj(a,b,c){this.a=a -this.b=b -this.c=c}, -Tp:function Tp(){}, +d:function d(){}, E1:function E1(){}, lc:function lc(){}, -z:function z(){}, -r:function r(a,b){this.a=a +zx:function zx(){}, +rT:function rT(a,b){this.a=a this.b=b}, GK:function GK(a){this.a=a}, Eq:function Eq(a){this.a=a}, -kr:function kr(){}, N5:function N5(a){var _=this _.a=0 _.f=_.e=_.d=_.c=_.b=null _.r=0 _.$ti=a}, -db:function db(a,b){var _=this +vh:function vh(a,b){var _=this _.a=a _.b=b _.d=_.c=null}, @@ -484,9 +429,18 @@ _.d=_.c=null}, dC:function dC(a){this.a=a}, wN:function wN(a){this.a=a}, VX:function VX(a){this.a=a}, -S5:function S5(){}, +M:function M(){}, B7:function B7(){}, +VR:function VR(a,b){var _=this +_.a=a +_.b=b +_.d=_.c=null}, od(a,b,c){if(a>>>0!==a||a>=c)throw A.Og(A.HY(b,a))}, +rM(a,b,c){var t +if(!(a>>>0!==a))t=b>>>0!==b||a>b||b>c +else t=!0 +if(t)throw A.Og(A.au(a,b,c)) +return b}, WZ:function WZ(){}, eH:function eH(){}, df:function df(){}, @@ -502,7 +456,7 @@ wf:function wf(){}, Pq:function Pq(){}, eE:function eE(){}, V6:function V6(){}, -VR:function VR(){}, +RG:function RG(){}, vX:function vX(){}, WB:function WB(){}, VS:function VS(){}, @@ -582,15 +536,15 @@ t.a=r t.b=p t.c=n return t}, -u(a,b){a[v.arrayRti]=b +j(a,b){a[v.arrayRti]=b return a}, JS(a){var t=a.$S if(t!=null){if(typeof t=="number")return A.Bp(t) return a.$S()}return null}, Ue(a,b){var t -if(A.Q1(b))if(a instanceof A.Tp){t=A.JS(a) -if(t!=null)return t}return A.d(a)}, -d(a){if(a instanceof A.a)return A.Lh(a) +if(A.Q1(b))if(a instanceof A.d){t=A.JS(a) +if(t!=null)return t}return A.z(a)}, +z(a){if(a instanceof A.a)return A.Lh(a) if(Array.isArray(a))return A.t6(a) return A.VU(J.c(a))}, t6(a){var t=a[v.arrayRti],s=u.b @@ -602,7 +556,7 @@ return t!=null?t:A.VU(a)}, VU(a){var t=a.constructor,s=t.$ccache if(s!=null)return s return A.r9(a,t)}, -r9(a,b){var t=a instanceof A.Tp?Object.getPrototypeOf(Object.getPrototypeOf(a)).constructor:b,s=A.ai(v.typeUniverse,t.name) +r9(a,b){var t=a instanceof A.d?Object.getPrototypeOf(Object.getPrototypeOf(a)).constructor:b,s=A.ai(v.typeUniverse,t.name) b.$ccache=s return s}, Bp(a){var t,s=v.types,r=s[a] @@ -611,12 +565,12 @@ s[a]=t return t}return r}, RW(a){return A.Kx(A.Lh(a))}, tu(a){var t -if(a instanceof A.S5)return A.Mi(a.$r,a.n()) -t=a instanceof A.Tp?A.JS(a):null +if(a instanceof A.M)return A.Mi(a.$r,a.n()) +t=a instanceof A.d?A.JS(a):null if(t!=null)return t if(u.R.b(a))return J.CR(a).a if(Array.isArray(a))return A.t6(a) -return A.d(a)}, +return A.z(a)}, Kx(a){var t=a.r return t==null?a.r=A.D6(a):t}, D6(a){var t,s,r=a.as,q=r.replace(/\*/g,"") @@ -625,7 +579,7 @@ t=A.Ew(v.typeUniverse,q,!0) s=t.r return s==null?t.r=A.D6(t):s}, Mi(a,b){var t,s,r=b,q=r.length -if(q===0)return u.d +if(q===0)return u.F t=A.cE(v.typeUniverse,A.tu(r[0]),"@<0>") for(s=1;s=0)q+=" "+s[r];++r}return q+"})"}, -h(a2,a3,a4){var t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1=", " +L(a2,a3,a4){var t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0=", ",a1=null if(a4!=null){t=a4.length -if(a3==null){a3=A.u([],u.s) -s=null}else s=a3.length -r=a3.length -for(q=t;q>0;--q)a3.push("T"+(r+q)) -for(p=u.X,o=u._,n="<",m="",q=0;q0){a+=a0+"[" -for(a0="",q=0;q0){a+=a0+"{" -for(a0="",q=0;q "+b}, +if(a3==null)a3=A.j([],u.s) +else a1=a3.length +s=a3.length +for(r=t;r>0;--r)a3.push("T"+(s+r)) +for(q=u.X,p=u._,o="<",n="",r=0;r0){b+=a+"[" +for(a="",r=0;r0){b+=a+"{" +for(a="",r=0;r "+c}, m(a,b){var t,s,r,q,p,o,n=a.w if(n===5)return"erased" if(n===2)return"dynamic" @@ -806,9 +755,9 @@ r=t.w return(r===12||r===13?"("+s+")":s)+"?"}if(n===8)return"FutureOr<"+A.m(a.x,b)+">" if(n===9){q=A.o(a.x) p=a.y -return p.length>0?q+("<"+A.M(p,b)+">"):q}if(n===11)return A.k(a,b) -if(n===12)return A.h(a,b,null) -if(n===13)return A.h(a.x,b,a.y) +return p.length>0?q+("<"+A.b(p,b)+">"):q}if(n===11)return A.k(a,b) +if(n===12)return A.L(a,b,null) +if(n===13)return A.L(a.x,b,a.y) if(n===14){o=a.x return b[b.length-1-o]}return"?"}, o(a){var t=v.mangledGlobalNames[a] @@ -880,10 +829,8 @@ a.eC.set(s,t) return t}, ll(a,b,c,d){var t,s,r,q if(d){t=b.w +s=!0 if(!A.Z4(b))if(!(b===u.P||b===u.T))if(t!==7)s=t===8&&A.lR(b.x) -else s=!0 -else s=!0 -else s=!0 if(s)return b else if(t===1||b===u.A)return u.P else if(t===6){r=b.x @@ -1039,7 +986,7 @@ case 91:l.push(a.p) a.p=l.length break case 93:p=l.splice(a.p) -A.rT(a.u,a.e,p) +A.cH(a.u,a.e,p) a.p=l.pop() l.push(p) l.push(-1) @@ -1077,7 +1024,7 @@ if(e){t=a.u p=a.e if(p.w===10)p=p.x o=A.Qo(t,p.x)[q] -if(o==null)A.vh('No "'+q+'" in "'+A.mD(p)+'"') +if(o==null)A.v('No "'+q+'" in "'+A.mD(p)+'"') d.push(A.cE(t,p,o))}else d.push(q) return n}, rD(a,b){var t,s=a.u,r=A.oU(a,b),q=b.pop() @@ -1087,45 +1034,40 @@ switch(t.w){case 12:b.push(A.DS(s,t,r,a.n)) break default:b.push(A.ap(s,t,r)) break}}}, -Mt(a,b){var t,s,r,q,p,o=null,n=a.u,m=b.pop() -if(typeof m=="number")switch(m){case-1:t=b.pop() -s=o +Mt(a,b){var t,s,r,q=a.u,p=b.pop(),o=null,n=null +if(typeof p=="number")switch(p){case-1:o=b.pop() break -case-2:s=b.pop() -t=o +case-2:n=b.pop() break -default:b.push(m) -s=o -t=s -break}else{b.push(m) -s=o -t=s}r=A.oU(a,b) -m=b.pop() -switch(m){case-3:m=b.pop() -if(t==null)t=n.sEA -if(s==null)s=n.sEA -q=A.KQ(n,a.e,m) -p=new A.ET() -p.a=r -p.b=t -p.c=s -b.push(A.Nf(n,q,p)) +default:b.push(p) +break}else b.push(p) +t=A.oU(a,b) +p=b.pop() +switch(p){case-3:p=b.pop() +if(o==null)o=q.sEA +if(n==null)n=q.sEA +s=A.KQ(q,a.e,p) +r=new A.ET() +r.a=t +r.b=o +r.c=n +b.push(A.Nf(q,s,r)) return -case-4:b.push(A.oP(n,b.pop(),r)) +case-4:b.push(A.oP(q,b.pop(),t)) return -default:throw A.Og(A.hV("Unexpected state under `()`: "+A.Ej(m)))}}, +default:throw A.Og(A.hV("Unexpected state under `()`: "+A.I(p)))}}, I3(a,b){var t=b.pop() if(0===t){b.push(A.mZ(a.u,1,"0&")) return}if(1===t){b.push(A.mZ(a.u,4,"1&")) -return}throw A.Og(A.hV("Unexpected extended operation "+A.Ej(t)))}, +return}throw A.Og(A.hV("Unexpected extended operation "+A.I(t)))}, oU(a,b){var t=b.splice(a.p) -A.rT(a.u,a.e,t) +A.cH(a.u,a.e,t) a.p=b.pop() return t}, KQ(a,b,c){if(typeof c=="string")return A.Q2(a,c,a.sEA) else if(typeof c=="number"){b.toString return A.TV(a,b,c)}else return c}, -rT(a,b,c){var t,s=c.length +cH(a,b,c){var t,s=c.length for(t=0;t").Kq(c).C("N5<1,2>")))}, C(a,b){return new A.N5(a.C("@<0>").Kq(b).C("N5<1,2>"))}, nO(a){var t,s={} -if(A.y(a))return"{...}" -t=new A.B("") +if(A.ks(a))return"{...}" +t=new A.Rn("") try{$.Qu.push(a) t.a+="{" s.a=!0 -a.aN(0,new A.GA(s,t)) +a.aN(0,new A.mN(s,t)) t.a+="}"}finally{$.Qu.pop()}s=t.a return s.charCodeAt(0)==0?s:s}, k6:function k6(){}, @@ -1305,56 +1243,81 @@ _.d=null _.$ti=c}, F:function F(){}, il:function il(){}, -GA:function GA(a,b){this.a=a +mN:function mN(a,b){this.a=a this.b=b}, -KP:function KP(){}, -Pn:function Pn(){}, -Gj:function Gj(){}, -RU:function RU(){}, +Uk:function Uk(){}, wI:function wI(){}, +Zi:function Zi(){}, +u5:function u5(){}, +E3:function E3(){}, +Rw:function Rw(a){this.b=0 +this.c=a}, +QA(a,b){var t=A.Hp(a,b) +if(t!=null)return t +throw A.Og(A.rr(a,null,null))}, O8(a,b,c){var t,s -if(a<0||a>4294967295)A.vh(A.TE(a,0,4294967295,"length",null)) -t=J.Ep(A.u(new Array(a),c.C("jd<0>"))) +if(a<0||a>4294967295)A.v(A.TE(a,0,4294967295,"length",null)) +t=J.x(A.j(new Array(a),c.C("jd<0>"))) if(a!==0&&b!=null)for(s=0;s")) -for(t=a.length,s=0;s")) -t=A.u([],b.C("jd<0>")) -for(s=J.I(a);s.G();)t.push(s.gl()) +u(a,b,c){var t,s=A.j([],c.C("jd<0>")) +for(t=J.p(a);t.G();)s.push(t.gl()) +if(b)return s +return J.x(s)}, +HM(a){var t +A.k1(0,"start") +t=A.Nz(a,0,null) return t}, -vg(a,b,c){var t=J.I(b) +Nz(a,b,c){var t=a.length +if(b>=t)return"" +return A.fw(a,b,t)}, +nu(a){return new A.VR(a,A.v4(a,!1,!0,!1,!1,!1))}, +vg(a,b,c){var t=J.p(b) if(!t.G())return a -if(c.length===0){do a+=A.Ej(t.gl()) -while(t.G())}else{a+=A.Ej(t.gl()) -for(;t.G();)a=a+c+A.Ej(t.gl())}return a}, -Wi(a,b){return new A.mp(a,b.gV(),b.gnd(),b.gVm())}, -K(a){if(typeof a=="number"||A.rQ(a)||a==null)return J.t(a) +if(c.length===0){do a+=A.I(t.gl()) +while(t.G())}else{a+=A.I(t.gl()) +for(;t.G();)a=a+c+A.I(t.gl())}return a}, +eP(a,b,c,d){var t,s,r,q,p,o="0123456789ABCDEF" +if(c===B.xM){t=$.z4() +t=t.b.test(b)}else t=!1 +if(t)return b +s=B.Qk.W(b) +for(t=s.length,r=0,q="";r>>4]&1<<(p&15))!==0)q+=A.Lw(p) +else q=d&&p===32?q+"+":q+"%"+o[p>>>4&15]+o[p&15]}return q.charCodeAt(0)==0?q:q}, +tS(a){var t,s,r +if(!$.Ob())return A.yf(a) +t=new URLSearchParams() +a.aN(0,new A.bp(t)) +s=t.toString() +r=s.length +if(r>0&&s[r-1]==="=")s=B.xB.Nj(s,0,r-1) +return s.replace(/=&|\*|%7E/g,b=>b==="=&"?"&":b==="*"?"%2A":"~")}, +h(a){if(typeof a=="number"||A.y(a)||a==null)return J.t(a) if(typeof a=="string")return JSON.stringify(a) -return A.ik(a)}, +return A.i(a)}, hV(a){return new A.C6(a)}, -xY(a){return new A.AT(!1,null,null,a)}, +q(a){return new A.AT(!1,null,null,a)}, TE(a,b,c,d,e){return new A.bJ(b,c,!0,a,d,"Invalid value")}, jB(a,b,c){if(0>a||a>c)throw A.Og(A.TE(a,0,c,"start",null)) if(b!=null){if(a>b||b>c)throw A.Og(A.TE(b,a,c,"end",null)) return b}return c}, +k1(a,b){if(a<0)throw A.Og(A.TE(a,0,null,b,null)) +return a}, xF(a,b,c,d){return new A.eY(b,!0,a,d,"Index out of range")}, u0(a){return new A.ub(a)}, SY(a){return new A.ds(a)}, a4(a){return new A.UV(a)}, +rr(a,b,c){return new A.aE(a,b,c)}, Sd(a,b,c){var t,s -if(A.y(a)){if(b==="("&&c===")")return"(...)" -return b+"..."+c}t=A.u([],u.s) +if(A.ks(a)){if(b==="("&&c===")")return"(...)" +return b+"..."+c}t=A.j([],u.s) $.Qu.push(a) try{A.Vr(a,t)}finally{$.Qu.pop()}s=A.vg(b,t,", ")+c return s.charCodeAt(0)==0?s:s}, -x(a,b,c){var t,s -if(A.y(a))return b+"..."+c -t=new A.B(b) +tA(a,b,c){var t,s +if(A.ks(a))return b+"..."+c +t=new A.Rn(b) $.Qu.push(a) try{s=t s.a=A.vg(s.a,a,", ")}finally{$.Qu.pop()}t.a+=c @@ -1363,20 +1326,20 @@ return s.charCodeAt(0)==0?s:s}, Vr(a,b){var t,s,r,q,p,o,n,m=a.gkz(a),l=0,k=0 while(!0){if(!(l<80||k<3))break if(!m.G())return -t=A.Ej(m.gl()) +t=A.I(m.gl()) b.push(t) l+=t.length+2;++k}if(!m.G()){if(k<=5)return s=b.pop() r=b.pop()}else{q=m.gl();++k -if(!m.G()){if(k<=4){b.push(A.Ej(q)) -return}s=A.Ej(q) +if(!m.G()){if(k<=4){b.push(A.I(q)) +return}s=A.I(q) r=b.pop() l+=s.length+2}else{p=m.gl();++k for(;m.G();q=p,p=o){o=m.gl();++k if(k>100){while(!0){if(!(l>75&&k>3))break l-=b.pop().length+2;--k}b.push("...") -return}}r=A.Ej(q) -s=A.Ej(p) +return}}r=A.I(q) +s=A.I(p) l+=s.length+r.length+4}}if(k>b.length+2){l+=5 n="..."}else n=null while(!0){if(!(l>80&&b.length>3))break @@ -1386,19 +1349,278 @@ n="..."}}if(n!=null)b.push(n) b.push(r) b.push(s)}, f5(a,b,c,d){var t -if(B.zt===c){t=B.jn.giO(a) +if(B.zt===c){t=B.jn.gi(a) b=J.Nu(b) -return A.qL(A.yc(A.yc($.t8(),t),b))}if(B.zt===d){t=B.jn.giO(a) +return A.qL(A.yc(A.yc($.t8(),t),b))}if(B.zt===d){t=B.jn.gi(a) b=J.Nu(b) c=J.Nu(c) -return A.qL(A.yc(A.yc(A.yc($.t8(),t),b),c))}t=B.jn.giO(a) +return A.qL(A.yc(A.yc(A.yc($.t8(),t),b),c))}t=B.jn.gi(a) b=J.Nu(b) c=J.Nu(c) d=J.Nu(d) d=A.qL(A.yc(A.yc(A.yc(A.yc($.t8(),t),b),c),d)) return d}, -CL:function CL(a,b){this.a=a -this.b=b}, +Hh(a,b,c){var t,s,r,q,p,o,n="IPv4 address should contain exactly 4 parts",m="each part must be in the range 0..255",l=new A.cS(a),k=new Uint8Array(4) +for(t=b,s=t,r=0;t9)l.$2("invalid character",t)}else{if(r===3)l.$2(n,t) +p=A.QA(B.xB.Nj(a,s,t),null) +if(p>255)l.$2(m,s) +o=r+1 +k[r]=p +s=t+1 +r=o}}if(r!==3)l.$2(n,c) +p=A.QA(B.xB.Nj(a,s,c),null) +if(p>255)l.$2(m,s) +k[r]=p +return k}, +eg(a,b,c){var t,s,r,q,p,o,n,m,l,k,j,i,h,g,f=null,e=new A.VC(a),d=new A.JT(e,a) +if(a.length<2)e.$2("address is too short",f) +t=A.j([],u.t) +for(s=b,r=s,q=!1,p=!1;s>>0) +t.push((l[2]<<8|l[3])>>>0)}if(q){if(t.length>7)e.$2("an address with a wildcard must have less than 7 parts",f)}else if(t.length!==8)e.$2("an address without a wildcard must contain exactly 8 parts",f) +k=new Uint8Array(16) +for(m=t.length,j=9-m,s=0,i=0;s=b&&r=b&&t>>4]&1<<(q&15))!==0){if(r&&65<=q&&90>=q){if(j==null)j=new A.Rn("") +if(s>>4]&1<<(p&15))!==0){if(q&&65<=p&&90>=p){if(r==null)r=new A.Rn("") +if(s>>4]&1<<(p&15))!==0)A.R3(a,t,"Invalid character") +else{k=1 +if((p&64512)===55296&&t+1>>4]&1<<(r&15))!==0))A.R3(a,t,"Illegal scheme character") +if(65<=r&&r<=90)s=!0}a=B.xB.Nj(a,b,c) +return A.Ya(s?a.toLowerCase():a)}, +Ya(a){if(a==="http")return"http" +if(a==="file")return"file" +if(a==="https")return"https" +if(a==="package")return"package" +return a}, +zR(a,b,c){return A.PI(a,b,c,B.TA,!1,!1)}, +ka(a,b,c,d,e,f){var t=e==="file",s=t||f,r=new A.A8(d,new A.RZ(),A.t6(d).C("A8<1,qU>")).H(0,"/") +if(r.length===0){if(t)return"/"}else if(s&&!B.xB.R(r,"/"))r="/"+r +return A.Jr(r,e,f)}, +Jr(a,b,c){var t=b.length===0 +if(t&&!c&&!B.xB.R(a,"/")&&!B.xB.R(a,"\\"))return A.wF(a,!t||c) +return A.xe(a)}, +le(a,b,c,d){return A.tS(d)}, +yf(a){var t={},s=new A.Rn("") +t.a="" +a.aN(0,new A.fq(new A.IP(t,s))) +t=s.a +return t.charCodeAt(0)==0?t:t}, +tG(a,b,c){return null}, +rv(a,b,c){var t,s,r,q,p,o=b+2 +if(o>=a.length)return"%" +t=a.charCodeAt(b+1) +s=a.charCodeAt(o) +r=A.oo(t) +q=A.oo(s) +if(r<0||q<0)return"%" +p=r*16+q +if(p<127&&(B.fY[B.jn.wG(p,4)]&1<<(p&15))!==0)return A.Lw(c&&65<=p&&90>=p?(p|32)>>>0:p) +if(t>=97||s>=97)return B.xB.Nj(a,b,b+3).toUpperCase() +return null}, +zX(a){var t,s,r,q,p,o="0123456789ABCDEF" +if(a<128){t=new Uint8Array(3) +t[0]=37 +t[1]=o.charCodeAt(a>>>4) +t[2]=o.charCodeAt(a&15)}else{if(a>2047)if(a>65535){s=240 +r=4}else{s=224 +r=3}else{s=192 +r=2}t=new Uint8Array(3*r) +for(q=0;--r,r>=0;s=128){p=B.jn.bf(a,6*r)&63|s +t[q]=37 +t[q+1]=o.charCodeAt(p>>>4) +t[q+2]=o.charCodeAt(p&15) +q+=3}}return A.HM(t)}, +PI(a,b,c,d,e,f){var t=A.Ul(a,b,c,d,e,f) +return t==null?B.xB.Nj(a,b,c):t}, +Ul(a,b,c,d,e,f){var t,s,r,q,p,o,n,m,l,k,j=null +for(t=!e,s=b,r=s,q=j;s>>4]&1<<(p&15))!==0)++s +else{o=1 +if(p===37){n=A.rv(a,s,!1) +if(n==null){s+=3 +continue}if("%"===n)n="%25" +else o=3}else if(p===92&&f)n="/" +else if(t&&p<=93&&(B.Eb[p>>>4]&1<<(p&15))!==0){A.R3(a,s,"Invalid character") +o=j +n=o}else{if((p&64512)===55296){m=s+1 +if(m=2&&A.Et(a.charCodeAt(0)))for(t=1;t127||(B.Ho[s>>>4]&1<<(s&15))===0)break}return a}, +Et(a){var t=a|32 +return 97<=t&&t<=122}, +bp:function bp(a){this.a=a}, Ge:function Ge(){}, C6:function C6(a){this.a=a}, E:function E(){}, @@ -1420,101 +1642,120 @@ _.a=b _.b=c _.c=d _.d=e}, -mp:function mp(a,b,c,d){var _=this -_.a=a -_.b=b -_.c=c -_.d=d}, ub:function ub(a){this.a=a}, ds:function ds(a){this.a=a}, +lj:function lj(a){this.a=a}, UV:function UV(a){this.a=a}, +k5:function k5(){}, +aE:function aE(a,b,c){this.a=a +this.b=b +this.c=c}, cX:function cX(){}, c8:function c8(){}, a:function a(){}, -B:function B(a){this.a=a}, -SS(a){var t,s=a.$dart_jsFunction -if(s!=null)return s -t=function(b,c){return function(){return b(c,Array.prototype.slice.apply(arguments))}}(A.Oo,a) -t[$.w()]=a -a.$dart_jsFunction=t -return t}, -Oo(a,b){return A.im(a,b,null)}, -v(a){if(typeof a=="function")return a -else return A.SS(a)}, -m6(a){return a==null||A.rQ(a)||typeof a=="number"||typeof a=="string"||u.U.b(a)||u.E.b(a)||u.e.b(a)||u.O.b(a)||u.D.b(a)||u.k.b(a)||u.v.b(a)||u.C.b(a)||u.q.b(a)||u.J.b(a)||u.Y.b(a)}, +Rn:function Rn(a){this.a=a}, +cS:function cS(a){this.a=a}, +VC:function VC(a){this.a=a}, +JT:function JT(a,b){this.a=a +this.b=b}, +Dn:function Dn(a,b,c,d,e,f,g){var _=this +_.a=a +_.b=b +_.c=c +_.d=d +_.e=e +_.f=f +_.r=g +_.y=_.w=$}, +RZ:function RZ(){}, +IP:function IP(a,b){this.a=a +this.b=b}, +fq:function fq(a){this.a=a}, +K(a,b,c){if(c>=1)return a.$1(b) +return a.$0()}, +m6(a){return a==null||A.y(a)||typeof a=="number"||typeof a=="string"||u.U.b(a)||u.E.b(a)||u.e.b(a)||u.O.b(a)||u.D.b(a)||u.k.b(a)||u.v.b(a)||u.B.b(a)||u.q.b(a)||u.J.b(a)||u.Y.b(a)}, Pe(a){if(A.m6(a))return a return new A.Pb(new A.YF(u.G)).$1(a)}, Pb:function Pb(a){this.a=a}, lM:function lM(){this.a=$}, YE:function YE(){}, -E2(){var t,s,r,q=self,p=q.document.querySelectorAll("pre > code[data-dartpad]:only-child"),o=u.N,n=A.C(o,o) -q.window.addEventListener("message",u.g.a(A.v(new A.e(n)))) -for(q=u.m,t=0;t code[data-dartpad]:only-child"),n=u.N,m=A.C(n,n) +p=p.window +n=new A.e(m) +if(typeof n=="function")A.v(A.q("Attempting to rewrap a JS function.")) +t=function(a,b){return function(c){return a(b,c,arguments.length)}}(A.K,n) +t[$.w()]=n +p.addEventListener("message",t) +for(p=u.m,s=0;s").Kq(c).C("A8<1,2>"))}, H(a,b){var t,s=A.O8(a.length,"",u.N) -for(t=0;t0)return a[t-1] +throw A.Og(A.Wp())}, +"["(a){return A.tA(a,"[","]")}, gkz(a){return new J.D(a,a.length,A.t6(a).C("D<1>"))}, -giO(a){return A.eQ(a)}, +gi(a){return A.eQ(a)}, gB(a){return a.length}, $ibQ:1, $icX:1, @@ -1565,17 +1802,19 @@ return!0}} J.qI.prototype={ "["(a){if(a===0&&1/a<0)return"-0.0" else return""+a}, -giO(a){var t,s,r,q,p=a|0 +gi(a){var t,s,r,q,p=a|0 if(a===p)return p&536870911 t=Math.abs(a) s=Math.log(t)/0.6931471805599453|0 r=Math.pow(2,s) q=t<1?t/r:r/t return((q*9007199254740992|0)+(q*3542243181176521|0))*599197+s*1259&536870911}, -A(a,b){var t +wG(a,b){var t if(a>0)t=this.p(a,b) else{t=b>31?31:b t=a>>t>>>0}return t}, +bf(a,b){if(0>b)throw A.Og(A.tL(b)) +return this.p(a,b)}, p(a,b){return b>31?0:a>>>b}, gbx(a){return A.Kx(u.H)}, $iCP:1} @@ -1588,23 +1827,34 @@ gbx(a){return A.Kx(u.i)}, $iy5:1} J.Dr.prototype={ h(a,b){return a+b}, -R(a,b){var t=b.length +Y(a,b,c){var t +if(c<0||c>a.length)throw A.Og(A.TE(c,0,a.length,null,null)) +t=c+b.length if(t>a.length)return!1 -return b===a.substring(0,t)}, -J(a,b,c){return a.substring(b,A.jB(b,c,a.length))}, -yn(a,b){return this.J(a,b,null)}, +return b===a.substring(c,t)}, +R(a,b){return this.Y(a,b,0)}, +Nj(a,b,c){return a.substring(b,A.jB(b,c,a.length))}, +yn(a,b){return this.Nj(a,b,null)}, OF(a){var t,s=a.trimEnd(),r=s.length if(r===0)return s t=r-1 if(s.charCodeAt(t)!==133)return s return s.substring(0,J.c1(s,t))}, +I(a,b){var t,s +if(0>=b)return"" +if(b===1||a.length===0)return a +if(b!==b>>>0)throw A.Og(B.Eq) +for(t=a,s="";!0;){if((b&1)===1)s=t+s +b=b>>>1 +if(b===0)break +t+=t}return s}, K(a,b,c){var t if(c<0||c>a.length)throw A.Og(A.TE(c,0,a.length,null,null)) t=a.indexOf(b,c) return t}, M(a,b){return this.K(a,b,0)}, "["(a){return a}, -giO(a){var t,s,r +gi(a){var t,s,r for(t=a.length,s=0,r=0;r>6}s=s+((s&67108863)<<3)&536870911 @@ -1619,8 +1869,16 @@ A.n.prototype={ A.zl.prototype={} A.bQ.prototype={} A.aL.prototype={ -gkz(a){return new A.a7(this,this.gB(0),this.$ti.C("a7"))}, -E2(a,b,c){return new A.A8(this,b,this.$ti.C("@").Kq(c).C("A8<1,2>"))}} +gkz(a){var t=this +return new A.a7(t,t.gB(t),A.Lh(t).C("a7"))}, +H(a,b){var t,s,r,q=this,p=q.gB(q) +if(b.length!==0){if(p===0)return"" +t=A.I(q.F(0,0)) +if(p!==q.gB(q))throw A.Og(A.a4(q)) +for(s=t,r=1;r").Kq(c).C("A8<1,2>"))}} A.a7.prototype={ gl(){var t=this.d return t==null?this.$ti.c.a(t):t}, @@ -1628,11 +1886,11 @@ G(){var t,s=this,r=s.a,q=J.U6(r),p=q.gB(r) if(s.b!==p)throw A.Og(A.a4(r)) t=s.c if(t>=p){s.d=null -return!1}s.d=q.Z(r,t);++s.c +return!1}s.d=q.F(r,t);++s.c return!0}} A.i1.prototype={ -gkz(a){var t=this.a,s=A.Lh(this) -return new A.MH(t.gkz(t),this.b,s.C("@<1>").Kq(s.y[1]).C("MH<1,2>"))}, +gkz(a){var t=this.a +return new A.MH(t.gkz(t),this.b,A.Lh(this).C("MH<1,2>"))}, gB(a){var t=this.a return t.gB(t)}} A.xy.prototype={$ibQ:1} @@ -1645,105 +1903,36 @@ gl(){var t=this.a return t==null?this.$ti.y[1].a(t):t}} A.A8.prototype={ gB(a){return J.Hm(this.a)}, -Z(a,b){return this.b.$1(J.Av(this.a,b))}} +F(a,b){return this.b.$1(J.GA(this.a,b))}} A.SU.prototype={} -A.wv.prototype={ -giO(a){var t=this._hashCode -if(t!=null)return t -t=664597*B.xB.giO(this.a)&536870911 -this._hashCode=t -return t}, -"["(a){return'Symbol("'+this.a+'")'}, -DN(a,b){if(b==null)return!1 -return b instanceof A.wv&&this.a===b.a}, -$iGD:1} A.S0.prototype={$r:"+code,id(1,2)",$s:1} -A.PD.prototype={} -A.ys.prototype={ -"["(a){return A.nO(this)}, -$iT8:1} -A.LP.prototype={ -gB(a){return this.b.length}, -gMV(){var t=this.$keys -if(t==null){t=Object.keys(this.a) -this.$keys=t}return t}, -x4(a){if(typeof a!="string")return!1 -if("__proto__"===a)return!1 -return this.a.hasOwnProperty(a)}, -q(a,b){if(!this.x4(b))return null -return this.b[this.a[b]]}, -aN(a,b){var t,s,r=this.gMV(),q=this.b -for(t=r.length,s=0;s"))}} -A.Ku.prototype={ -gB(a){return this.a.length}, -gkz(a){var t=this.a -return new A.vI(t,t.length,this.$ti.C("vI<1>"))}} -A.vI.prototype={ -gl(){var t=this.d -return t==null?this.$ti.c.a(t):t}, -G(){var t=this,s=t.c -if(s>=t.b){t.d=null -return!1}t.d=t.a[s] -t.c=s+1 -return!0}} -A.LI.prototype={ -gV(){var t=this.a -return t}, -gnd(){var t,s,r,q,p=this -if(p.c===1)return B.xD -t=p.d -s=t.length-p.e.length-p.f -if(s===0)return B.xD -r=[] -for(q=0;q>>0}, +gi(a){return(A.CU(this.a)^A.eQ(this.$_target))>>>0}, "["(a){return"Closure '"+this.$_name+"' of "+("Instance of '"+A.l(this.a)+"'")}} A.GK.prototype={ "["(a){return"Reading static variable '"+this.a+"' during its initialization"}} A.Eq.prototype={ "["(a){return"RuntimeError: "+this.a}} -A.kr.prototype={} A.N5.prototype={ gB(a){return this.a}, -gI(){return new A.i5(this,A.Lh(this).C("i5<1>"))}, -x4(a){var t=this.b -if(t==null)return!1 -return t[a]!=null}, +gv(){return new A.i5(this,this.$ti.C("i5<1>"))}, q(a,b){var t,s,r,q,p=null if(typeof b=="string"){t=this.b if(t==null)return p @@ -1753,24 +1942,24 @@ return r}else if(typeof b=="number"&&(b&0x3fffffff)===b){q=this.c if(q==null)return p s=q[b] r=s==null?p:s.b -return r}else return this.v(b)}, -v(a){var t,s,r=this.d +return r}else return this.aa(b)}, +aa(a){var t,s,r=this.d if(r==null)return null -t=r[this.O(a)] +t=r[J.Nu(a)&1073741823] s=this.X(t,a) if(s<0)return null return t[s].b}, t(a,b,c){var t,s,r,q,p,o,n=this if(typeof b=="string"){t=n.b -n.m(t==null?n.b=n.F():t,b,c)}else if(typeof b=="number"&&(b&0x3fffffff)===b){s=n.c -n.m(s==null?n.c=n.F():s,b,c)}else{r=n.d -if(r==null)r=n.d=n.F() -q=n.O(b) +n.m(t==null?n.b=n.A():t,b,c)}else if(typeof b=="number"&&(b&0x3fffffff)===b){s=n.c +n.m(s==null?n.c=n.A():s,b,c)}else{r=n.d +if(r==null)r=n.d=n.A() +q=J.Nu(b)&1073741823 p=r[q] -if(p==null)r[q]=[n.i(b,c)] +if(p==null)r[q]=[n.O(b,c)] else{o=n.X(p,b) if(o>=0)p[o].b=c -else p.push(n.i(b,c))}}}, +else p.push(n.O(b,c))}}}, j(a,b){var t=this.H4(this.b,b) return t}, aN(a,b){var t=this,s=t.e,r=t.r @@ -1778,17 +1967,17 @@ for(;s!=null;){b.$2(s.a,s.b) if(r!==t.r)throw A.Og(A.a4(t)) s=s.c}}, m(a,b,c){var t=a[b] -if(t==null)a[b]=this.i(b,c) +if(t==null)a[b]=this.O(b,c) else t.b=c}, H4(a,b){var t if(a==null)return null t=a[b] if(t==null)return null -this.T(t) +this.GS(t) delete a[b] return t.b}, S(){this.r=this.r+1&1073741823}, -i(a,b){var t,s=this,r=new A.db(a,b) +O(a,b){var t,s=this,r=new A.vh(a,b) if(s.e==null)s.e=s.f=r else{t=s.f t.toString @@ -1796,24 +1985,23 @@ r.d=t s.f=t.c=r}++s.a s.S() return r}, -T(a){var t=this,s=a.d,r=a.c +GS(a){var t=this,s=a.d,r=a.c if(s==null)t.e=r else s.c=r if(r==null)t.f=s else r.d=s;--t.a t.S()}, -O(a){return J.Nu(a)&1073741823}, X(a,b){var t,s if(a==null)return-1 t=a.length for(s=0;s"]=t delete t[""] return t}} -A.db.prototype={} +A.vh.prototype={} A.i5.prototype={ gB(a){return this.a.a}, gkz(a){var t=this.a,s=new A.N6(t,t.r) @@ -1834,31 +2022,36 @@ A.wN.prototype={ $2(a,b){return this.a(a,b)}} A.VX.prototype={ $1(a){return this.a(a)}} -A.S5.prototype={ +A.M.prototype={ "["(a){return this.k(!1)}, k(a){var t,s,r,q,p,o=this.D(),n=this.n(),m=(a?""+"Record ":"")+"(" for(t=o.length,s="",r=0;r0;){--r;--t -l[r]=s[t]}}return J.un(A.PW(l,!1,u.K))}} +l[r]=s[t]}}l=A.u(l,!1,u.K) +l.fixed$length=Array +l.immutable$list=Array +return l}} A.B7.prototype={ n(){return[this.a,this.b]}, DN(a,b){if(b==null)return!1 return b instanceof A.B7&&this.$s===b.$s&&J.cf(this.a,b.a)&&J.cf(this.b,b.b)}, -giO(a){return A.f5(this.$s,this.a,this.b,B.zt)}} +gi(a){return A.f5(this.$s,this.a,this.b,B.zt)}} +A.VR.prototype={ +"["(a){return"RegExp/"+this.a+"/"+this.b.flags}} A.WZ.prototype={ gbx(a){return B.TE}, $iy5:1, @@ -1930,7 +2123,7 @@ q(a,b){A.od(b,a,a.length) return a[b]}, $iy5:1, $in6:1} -A.VR.prototype={} +A.RG.prototype={} A.vX.prototype={} A.WB.prototype={} A.VS.prototype={} @@ -1945,7 +2138,7 @@ A.u9.prototype={ A.iM.prototype={} A.k6.prototype={ gB(a){return this.a}, -gI(){return new A.Ni(this,this.$ti.C("Ni<1>"))}, +gv(){return new A.Ni(this,this.$ti.C("Ni<1>"))}, x4(a){var t,s if(typeof a=="string"&&a!=="__proto__"){t=this.b return t==null?!1:t[a]!=null}else if(typeof a=="number"&&(a&1073741823)===a){s=this.c @@ -1982,18 +2175,18 @@ Cf(){var t,s,r,q,p,o,n,m,l,k,j=this,i=j.e if(i!=null)return i i=A.O8(j.a,null,u.z) t=j.b -if(t!=null){s=Object.getOwnPropertyNames(t) -r=s.length -for(q=0,p=0;p"))}, -Z(a,b){return this.q(a,b)}, -E2(a,b,c){return new A.A8(a,b,A.d(a).C("@").Kq(c).C("A8<1,2>"))}, -"["(a){return A.x(a,"[","]")}} +gkz(a){return new A.a7(a,this.gB(a),A.z(a).C("a7"))}, +F(a,b){return this.q(a,b)}, +E2(a,b,c){return new A.A8(a,b,A.z(a).C("@").Kq(c).C("A8<1,2>"))}, +"["(a){return A.tA(a,"[","]")}} A.il.prototype={ aN(a,b){var t,s,r,q -for(t=this.gI(),t=t.gkz(t),s=A.Lh(this).y[1];t.G();){r=t.gl() +for(t=this.gv(),t=t.gkz(t),s=A.Lh(this).y[1];t.G();){r=t.gl() q=this.q(0,r) b.$2(r,q==null?s.a(q):q)}}, -gB(a){var t=this.gI() +gB(a){var t=this.gv() return t.gB(t)}, -"["(a){return A.nO(this)}, -$iT8:1} -A.GA.prototype={ +"["(a){return A.nO(this)}} +A.mN.prototype={ $2(a,b){var t,s=this.a if(!s.a)this.b.a+=", " s.a=!1 s=this.b -t=A.Ej(a) +t=A.I(a) t=s.a+=t s.a=t+": " -t=A.Ej(b) +t=A.I(b) s.a+=t}} -A.KP.prototype={} -A.Pn.prototype={ -q(a,b){return this.a.q(0,b)}, -aN(a,b){this.a.aN(0,b)}, -gB(a){return this.a.a}, -gI(){var t=this.a -return new A.i5(t,t.$ti.C("i5<1>"))}, -"["(a){return A.nO(this.a)}, -$iT8:1} -A.Gj.prototype={} -A.RU.prototype={} +A.Uk.prototype={} A.wI.prototype={} -A.CL.prototype={ -$2(a,b){var t=this.b,s=this.a,r=t.a+=s.a -r+=a.a -t.a=r -t.a=r+": " -r=A.K(b) -t.a+=r -s.a=", "}} +A.Zi.prototype={} +A.u5.prototype={} +A.E3.prototype={ +W(a){var t,s,r,q=A.jB(0,null,a.length) +if(q===0)return new Uint8Array(0) +t=q*3 +s=new Uint8Array(t) +r=new A.Rw(s) +if(r.T(a,0,q)!==q)r.RO() +return new Uint8Array(s.subarray(0,A.rM(0,r.b,t)))}} +A.Rw.prototype={ +RO(){var t=this,s=t.c,r=t.b,q=t.b=r+1 +s[r]=239 +r=t.b=q+1 +s[q]=191 +t.b=r+1 +s[r]=189}, +O6(a,b){var t,s,r,q,p=this +if((b&64512)===56320){t=65536+((a&1023)<<10)|b&1023 +s=p.c +r=p.b +q=p.b=r+1 +s[r]=t>>>18|240 +r=p.b=q+1 +s[q]=t>>>12&63|128 +q=p.b=r+1 +s[r]=t>>>6&63|128 +p.b=q+1 +s[q]=t&63|128 +return!0}else{p.RO() +return!1}}, +T(a,b,c){var t,s,r,q,p,o,n,m=this +if(b!==c&&(a.charCodeAt(c-1)&64512)===55296)--c +for(t=m.c,s=t.length,r=b;r=s)break +m.b=p+1 +t[p]=q}else{p=q&64512 +if(p===55296){if(m.b+4>s)break +o=r+1 +if(m.O6(q,a.charCodeAt(o)))r=o}else if(p===56320){if(m.b+3>s)break +m.RO()}else if(q<=2047){p=m.b +n=p+1 +if(n>=s)break +m.b=n +t[p]=q>>>6|192 +m.b=n+1 +t[n]=q&63|128}else{p=m.b +if(p+2>=s)break +n=m.b=p+1 +t[p]=q>>>12|224 +p=m.b=n+1 +t[n]=q>>>6&63|128 +m.b=p+1 +t[p]=q&63|128}}}return r}} +A.bp.prototype={ +$2(a,b){var t,s +if(typeof b=="string")this.a.set(a,b) +else if(b==null)this.a.set(a,"") +else for(t=J.p(b),s=this.a;t.G();){b=t.gl() +if(typeof b=="string")s.append(a,b) +else if(b==null)s.append(a,"") +else A.tE(b)}}} A.Ge.prototype={} A.C6.prototype={ "["(a){var t=this.a -if(t!=null)return"Assertion failed: "+A.K(t) +if(t!=null)return"Assertion failed: "+A.h(t) return"Assertion failed"}} A.E.prototype={} A.AT.prototype={ -gL(){return"Invalid argument"+(!this.a?"(s)":"")}, -gY(){return""}, -"["(a){var t=this,s=t.c,r=s==null?"":" ("+s+")",q=t.d,p=q==null?"":": "+q,o=t.gL()+r+p +gZ(){return"Invalid argument"+(!this.a?"(s)":"")}, +gN(){return""}, +"["(a){var t=this,s=t.c,r=s==null?"":" ("+s+")",q=t.d,p=q==null?"":": "+q,o=t.gZ()+r+p if(!t.a)return o -return o+t.gY()+": "+A.K(t.gE())}, +return o+t.gN()+": "+A.h(t.gE())}, gE(){return this.b}} A.bJ.prototype={ gE(){return this.b}, -gL(){return"RangeError"}, -gY(){var t,s=this.e,r=this.f -if(s==null)t=r!=null?": Not less than or equal to "+A.Ej(r):"" -else if(r==null)t=": Not greater than or equal to "+A.Ej(s) -else if(r>s)t=": Not in inclusive range "+A.Ej(s)+".."+A.Ej(r) -else t=rs)t=": Not in inclusive range "+A.I(s)+".."+A.I(r) +else t=rf.length +else t=!1 +if(t)g=null +if(g==null){if(f.length>78)f=B.xB.Nj(f,0,75)+"..." +return h+"\n"+f}for(s=1,r=0,q=!1,p=0;p1?h+(" (at line "+s+", character "+(g-r+1)+")\n"):h+(" (at character "+(g+1)+")\n") +n=f.length +for(p=g;p78){l="..." +if(g-r<75){k=r+75 +j=r}else{if(n-g<75){j=n-75 +k=n +l=""}else{j=g-36 +k=g+36}m="..."}}else{k=n +j=r +l=""}return h+m+B.xB.Nj(f,j,k)+l+"\n"+B.xB.I(" ",g-j+m.length)+"^\n"}else return g!=null?h+(" (at offset "+A.I(g)+")"):h}} A.cX.prototype={ E2(a,b,c){return A.K1(this,b,A.Lh(this).C("cX.E"),c)}, gB(a){var t,s=this.gkz(this) for(t=0;s.G();)++t return t}, +F(a,b){var t,s +A.k1(b,"index") +t=this.gkz(this) +for(s=b;t.G();){if(s===0)return t.gl();--s}throw A.Og(A.xF(b,b-s,this,"index"))}, "["(a){return A.Sd(this,"(",")")}} A.c8.prototype={ -giO(a){return A.a.prototype.giO.call(this,0)}, +gi(a){return A.a.prototype.gi.call(this,0)}, "["(a){return"null"}} A.a.prototype={$ia:1, DN(a,b){return this===b}, -giO(a){return A.eQ(this)}, +gi(a){return A.eQ(this)}, "["(a){return"Instance of '"+A.l(this)+"'"}, -e7(a,b){throw A.Og(A.Wi(this,b))}, gbx(a){return A.RW(this)}, toString(){return this["["](this)}} -A.B.prototype={ +A.Rn.prototype={ gB(a){return this.a.length}, "["(a){var t=this.a return t.charCodeAt(0)==0?t:t}} +A.cS.prototype={ +$2(a,b){throw A.Og(A.rr("Illegal IPv4 address, "+a,this.a,b))}} +A.VC.prototype={ +$2(a,b){throw A.Og(A.rr("Illegal IPv6 address, "+a,this.a,b))}} +A.JT.prototype={ +$2(a,b){var t +if(b-a>4)this.a.$2("an IPv6 part can only contain a maximum of 4 hex digits",a) +t=A.QA(B.xB.Nj(this.b,a,b),16) +if(t<0||t>65535)this.a.$2("each part must be in the range of `0x0..0xFFFF`",a) +return t}} +A.Dn.prototype={ +gL(){var t,s,r,q,p=this,o=p.w +if(o===$){t=p.a +s=t.length!==0?""+t+":":"" +r=p.c +q=r==null +if(!q||t==="file"){t=s+"//" +s=p.b +if(s.length!==0)t=t+s+"@" +if(!q)t+=r +s=p.d +if(s!=null)t=t+":"+A.I(s)}else t=s +t+=p.e +s=p.f +if(s!=null)t=t+"?"+s +s=p.r +if(s!=null)t=t+"#"+s +o!==$&&A.kL() +o=p.w=t.charCodeAt(0)==0?t:t}return o}, +gi(a){var t,s=this,r=s.y +if(r===$){t=B.xB.gi(s.gL()) +s.y!==$&&A.kL() +s.y=t +r=t}return r}, +gP(){var t=this.c +if(t==null)return"" +if(B.xB.R(t,"["))return B.xB.Nj(t,1,t.length-1) +return t}, +gtp(){var t=this.d +return t==null?A.wK(this.a):t}, +"["(a){return this.gL()}, +DN(a,b){var t,s,r,q,p,o=this +if(b==null)return!1 +if(o===b)return!0 +t=!1 +if(b instanceof A.Dn)if(o.a===b.a)if(o.c!=null===(b.c!=null))if(o.b===b.b)if(o.gP()===b.gP())if(o.gtp()===b.gtp())if(o.e===b.e){s=o.f +r=s==null +q=b.f +p=q==null +if(!r===!p){if(r)s="" +if(s===(p?"":q)){s=o.r +r=s==null +q=b.r +p=q==null +if(!r===!p){t=r?"":s +t=t===(p?"":q)}}}}return t}} +A.RZ.prototype={ +$1(a){return A.eP(B.Ji,a,B.xM,!1)}} +A.IP.prototype={ +$2(a,b){var t=this.b,s=this.a +t.a+=s.a +s.a="&" +s=A.eP(B.fY,a,B.xM,!0) +s=t.a+=s +if(b!=null&&b.length!==0){t.a=s+"=" +s=A.eP(B.fY,b,B.xM,!0) +t.a+=s}}} +A.fq.prototype={ +$2(a,b){var t,s +if(b==null||typeof b=="string")this.a.$2(a,b) +else for(t=J.p(b),s=this.a;t.G();)s.$2(a,t.gl())}} A.Pb.prototype={ $1(a){var t,s,r,q if(A.m6(a))return a t=this.a if(t.x4(a))return t.q(0,a) -if(u.F.b(a)){s={} +if(a instanceof A.il){s={} t.t(0,a,s) -for(t=a.gI(),t=t.gkz(t);t.G();){r=t.gl() +for(t=a.gv(),t=t.gkz(t);t.G();){r=t.gl() s[r]=this.$1(a.q(0,r))}return s}else if(u.x.b(a)){q=[] t.t(0,a,q) B.Nm.FV(q,J.M1(a,this,u.z)) @@ -2145,16 +2472,16 @@ A.YE.prototype={ U(){this.a=Math.max(18,5)}, W(a){var t,s,r,q,p,o,n,m,l,k,j,i,h,g=a.length if(!A.m2(a,"&",0))return a -t=new A.B("") +t=new A.Rn("") for(s=0;!0;){r=B.xB.K(a,"&",s) if(r===-1){t.a+=B.xB.yn(a,s) -break}q=t.a+=B.xB.J(a,s,r) +break}q=t.a+=B.xB.Nj(a,s,r) p=this.a p===$&&A.Q4() -o=B.xB.J(a,r,Math.min(g,r+p)) +o=B.xB.Nj(a,r,Math.min(g,r+p)) if(o.length>4&&o.charCodeAt(1)===35){n=B.xB.M(o,";") if(n!==-1){m=o.charCodeAt(2)===120 -l=B.xB.J(o,m?3:2,n) +l=B.xB.Nj(o,m?3:2,n) k=A.Hp(l,m?16:10) if(k==null)k=-1 if(k!==-1){t.a=q+A.Lw(k) @@ -2168,51 +2495,47 @@ s=r+h.length j=!0 break}++i}if(!j){t.a+="&";++s}}g=t.a return g.charCodeAt(0)==0?g:g}} +A.TZ.prototype={ +gB(a){return this.a.length}} A.e.prototype={ -$1(a){var t,s,r,q,p,o,n,m=null,l=a.data,k=u.m -if(k.b(l)){t=l.type +$1(a){var t,s,r,q,p,o,n=null,m=a.data,l=u.m,k=n,j=!1 +if(l.b(m)){t=m.type s=t if(s!=null){r=t==null?A.Bt(t):t -q=l.sender +q=m.sender s=q -if(s!=null){p=q==null?A.Bt(q):q -s=r==="ready"}else{p=m -s=!1}}else{p=m -s=!1}}else{p=m -s=!1}if(s){s=this.a -o=s.q(0,p) -if(o!=null){n=self.document.getElementById(p) -if(n==null)n=k.a(n) -k=u.N -k=A.Pe(A.EF(["sourceCode",o,"type","sourceCode"],k,k)) -A.tI(n.contentWindow,"postMessage",k,"*",m,m) -s.j(0,p)}}}};(function aliases(){var t=J.zh.prototype +if(s!=null){k=q==null?A.Bt(q):q +j=r==="ready"}}}if(j){j=this.a +p=j.q(0,k) +if(p!=null){o=self.document.getElementById(k) +if(o==null)o=l.a(o) +l=A.hy(o.contentWindow) +if(l!=null){s=u.N +s=A.Pe(A.EF(["sourceCode",p,"type","sourceCode"],s,s)) +l=l.a +l.postMessage(s,"*")}j.j(0,k)}}}};(function aliases(){var t=J.zh.prototype t.u=t["["]})();(function inheritance(){var t=hunkHelpers.mixin,s=hunkHelpers.inherit,r=hunkHelpers.inheritMany s(A.a,null) -r(A.a,[A.FK,J.vB,J.D,A.Ge,A.zl,A.cX,A.a7,A.MH,A.SU,A.wv,A.S5,A.Pn,A.ys,A.vI,A.LI,A.Tp,A.kr,A.il,A.db,A.N6,A.Jc,A.ET,A.lY,A.t3,A.F,A.KP,A.wI,A.c8,A.B]) -r(J.vB,[J.yE,J.CD,J.MF,J.yP,J.Dw,J.qI,J.Dr]) +r(A.a,[A.FK,J.vB,J.D,A.Ge,A.zl,A.cX,A.a7,A.MH,A.SU,A.M,A.d,A.il,A.vh,A.N6,A.VR,A.Jc,A.ET,A.lY,A.t3,A.F,A.Uk,A.wI,A.Rw,A.k5,A.aE,A.c8,A.Rn,A.Dn,A.TZ]) +r(J.vB,[J.yE,J.CD,J.MF,J.rQ,J.Dw,J.qI,J.Dr]) r(J.MF,[J.zh,J.jd,A.WZ,A.eH]) r(J.zh,[J.iC,J.kd,J.c5]) s(J.Po,J.jd) r(J.qI,[J.bU,J.kD]) -r(A.Ge,[A.n,A.GK,A.Eq,A.u9,A.C6,A.E,A.AT,A.mp,A.ub,A.ds,A.UV]) -r(A.cX,[A.bQ,A.i1,A.Ku]) +r(A.Ge,[A.n,A.GK,A.Eq,A.u9,A.C6,A.E,A.AT,A.ub,A.ds,A.lj,A.UV]) +r(A.cX,[A.bQ,A.i1]) r(A.bQ,[A.aL,A.i5,A.Ni]) s(A.xy,A.i1) s(A.A8,A.aL) -s(A.B7,A.S5) +s(A.B7,A.M) s(A.S0,A.B7) -s(A.RU,A.Pn) -s(A.Gj,A.RU) -s(A.PD,A.Gj) -s(A.LP,A.ys) -r(A.Tp,[A.E1,A.lc,A.dC,A.VX,A.Pb,A.e]) -r(A.E1,[A.Cj,A.wN,A.GA,A.CL]) -r(A.lc,[A.z,A.r]) +r(A.d,[A.E1,A.lc,A.dC,A.VX,A.RZ,A.Pb,A.e]) +r(A.lc,[A.zx,A.rT]) r(A.il,[A.N5,A.k6]) +r(A.E1,[A.wN,A.mN,A.bp,A.cS,A.VC,A.JT,A.IP,A.fq]) r(A.eH,[A.df,A.b0]) -r(A.b0,[A.VR,A.WB]) -s(A.vX,A.VR) +r(A.b0,[A.RG,A.WB]) +s(A.vX,A.RG) s(A.Dg,A.vX) s(A.VS,A.WB) s(A.DV,A.VS) @@ -2220,19 +2543,20 @@ r(A.Dg,[A.zU,A.K8]) r(A.DV,[A.xj,A.dE,A.ZA,A.wf,A.Pq,A.eE,A.V6]) s(A.iM,A.u9) s(A.YF,A.k6) +s(A.Zi,A.Uk) +s(A.u5,A.Zi) +r(A.wI,[A.E3,A.YE]) r(A.AT,[A.bJ,A.eY]) -s(A.YE,A.wI) s(A.lM,A.YE) -t(A.VR,A.F) +t(A.RG,A.F) t(A.vX,A.SU) t(A.WB,A.F) -t(A.VS,A.SU) -t(A.RU,A.KP)})() +t(A.VS,A.SU)})() var v={typeUniverse:{eC:new Map(),tR:{},eT:{},tPV:{},sEA:[]},mangledGlobalNames:{KN:"int",CP:"double",lf:"num",qU:"String",a2:"bool",c8:"Null",zM:"List",a:"Object",T8:"Map"},mangledNames:{},types:[],interceptorsByTag:null,leafTags:null,arrayRti:Symbol("$ti"),rttc:{"2;code,id":(a,b)=>c=>c instanceof A.S0&&a.b(c.a)&&b.b(c.b)}} -A.xb(v.typeUniverse,JSON.parse('{"iC":"zh","kd":"zh","c5":"zh","yE":{"y5":[]},"CD":{"y5":[]},"MF":{"vm":[]},"zh":{"vm":[]},"jd":{"zM":["1"],"bQ":["1"],"vm":[],"cX":["1"]},"Po":{"jd":["1"],"zM":["1"],"bQ":["1"],"vm":[],"cX":["1"]},"qI":{"CP":[]},"bU":{"CP":[],"KN":[],"y5":[]},"kD":{"CP":[],"y5":[]},"Dr":{"qU":[],"y5":[]},"bQ":{"cX":["1"]},"aL":{"bQ":["1"],"cX":["1"]},"i1":{"cX":["2"],"cX.E":"2"},"xy":{"i1":["1","2"],"bQ":["2"],"cX":["2"],"cX.E":"2"},"A8":{"aL":["2"],"bQ":["2"],"cX":["2"],"cX.E":"2","aL.E":"2"},"wv":{"GD":[]},"PD":{"T8":["1","2"]},"ys":{"T8":["1","2"]},"LP":{"T8":["1","2"]},"Ku":{"cX":["1"],"cX.E":"1"},"N5":{"il":["1","2"],"T8":["1","2"]},"i5":{"bQ":["1"],"cX":["1"],"cX.E":"1"},"WZ":{"vm":[],"I2":[],"y5":[]},"eH":{"vm":[]},"df":{"Wy":[],"vm":[],"y5":[]},"b0":{"Xj":["1"],"vm":[]},"Dg":{"F":["CP"],"zM":["CP"],"Xj":["CP"],"bQ":["CP"],"vm":[],"cX":["CP"]},"DV":{"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"]},"zU":{"F":["CP"],"oI":[],"zM":["CP"],"Xj":["CP"],"bQ":["CP"],"vm":[],"cX":["CP"],"y5":[],"F.E":"CP"},"K8":{"F":["CP"],"mJ":[],"zM":["CP"],"Xj":["CP"],"bQ":["CP"],"vm":[],"cX":["CP"],"y5":[],"F.E":"CP"},"xj":{"F":["KN"],"rF":[],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"dE":{"F":["KN"],"X6":[],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"ZA":{"F":["KN"],"ZX":[],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"wf":{"F":["KN"],"HS":[],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"Pq":{"F":["KN"],"Pz":[],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"eE":{"F":["KN"],"zt":[],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"V6":{"F":["KN"],"n6":[],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"k6":{"il":["1","2"],"T8":["1","2"]},"YF":{"k6":["1","2"],"il":["1","2"],"T8":["1","2"]},"Ni":{"bQ":["1"],"cX":["1"],"cX.E":"1"},"il":{"T8":["1","2"]},"Pn":{"T8":["1","2"]},"Gj":{"T8":["1","2"]},"zM":{"bQ":["1"],"cX":["1"]},"ZX":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"n6":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"zt":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"rF":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"HS":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"X6":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"Pz":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"oI":{"zM":["CP"],"bQ":["CP"],"cX":["CP"]},"mJ":{"zM":["CP"],"bQ":["CP"],"cX":["CP"]}}')) -A.FF(v.typeUniverse,JSON.parse('{"bQ":1,"SU":1,"ys":2,"N6":1,"b0":1,"KP":2,"Pn":2,"Gj":2,"RU":2,"wI":2}')) +A.xb(v.typeUniverse,JSON.parse('{"iC":"zh","kd":"zh","c5":"zh","yE":{"y5":[]},"CD":{"y5":[]},"MF":{"vm":[]},"zh":{"vm":[]},"jd":{"zM":["1"],"bQ":["1"],"vm":[],"cX":["1"]},"Po":{"jd":["1"],"zM":["1"],"bQ":["1"],"vm":[],"cX":["1"]},"qI":{"CP":[]},"bU":{"CP":[],"KN":[],"y5":[]},"kD":{"CP":[],"y5":[]},"Dr":{"qU":[],"y5":[]},"bQ":{"cX":["1"]},"aL":{"bQ":["1"],"cX":["1"]},"i1":{"cX":["2"],"cX.E":"2"},"xy":{"i1":["1","2"],"bQ":["2"],"cX":["2"],"cX.E":"2"},"A8":{"aL":["2"],"bQ":["2"],"cX":["2"],"aL.E":"2","cX.E":"2"},"N5":{"il":["1","2"]},"i5":{"bQ":["1"],"cX":["1"],"cX.E":"1"},"WZ":{"vm":[],"I2":[],"y5":[]},"eH":{"vm":[]},"df":{"Wy":[],"vm":[],"y5":[]},"b0":{"Xj":["1"],"vm":[]},"Dg":{"F":["CP"],"zM":["CP"],"Xj":["CP"],"bQ":["CP"],"vm":[],"cX":["CP"]},"DV":{"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"]},"zU":{"oI":[],"F":["CP"],"zM":["CP"],"Xj":["CP"],"bQ":["CP"],"vm":[],"cX":["CP"],"y5":[],"F.E":"CP"},"K8":{"mJ":[],"F":["CP"],"zM":["CP"],"Xj":["CP"],"bQ":["CP"],"vm":[],"cX":["CP"],"y5":[],"F.E":"CP"},"xj":{"rF":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"dE":{"X6":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"ZA":{"ZX":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"wf":{"HS":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"Pq":{"Pz":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"eE":{"zt":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"V6":{"n6":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"k6":{"il":["1","2"]},"YF":{"k6":["1","2"],"il":["1","2"]},"Ni":{"bQ":["1"],"cX":["1"],"cX.E":"1"},"zM":{"bQ":["1"],"cX":["1"]},"ZX":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"n6":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"zt":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"rF":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"HS":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"X6":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"Pz":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"oI":{"zM":["CP"],"bQ":["CP"],"cX":["CP"]},"mJ":{"zM":["CP"],"bQ":["CP"],"cX":["CP"]}}')) +A.FF(v.typeUniverse,JSON.parse('{"bQ":1,"SU":1,"N6":1,"b0":1,"Uk":2,"wI":2}')) var u=(function rtii(){var t=A.q7 -return{J:t("I2"),Y:t("Wy"),Z:t("PD"),Q:t("bQ<@>"),C:t("oI"),q:t("mJ"),a:t("EH"),O:t("rF"),k:t("X6"),U:t("ZX"),x:t("cX"),f:t("jd"),s:t("jd"),b:t("jd<@>"),T:t("CD"),m:t("vm"),g:t("c5"),p:t("Xj<@>"),B:t("N5"),F:t("T8"),P:t("c8"),K:t("a"),L:t("VY"),d:t("+()"),N:t("qU"),R:t("y5"),D:t("HS"),v:t("Pz"),e:t("zt"),E:t("n6"),o:t("kd"),G:t("YF"),y:t("a2"),i:t("CP"),z:t("@"),S:t("KN"),A:t("0&*"),_:t("a*"),V:t("b8?"),X:t("a?"),H:t("lf")}})();(function constants(){var t=hunkHelpers.makeConstList +return{J:t("I2"),Y:t("Wy"),Q:t("bQ<@>"),B:t("oI"),q:t("mJ"),Z:t("EH"),O:t("rF"),k:t("X6"),U:t("ZX"),x:t("cX"),f:t("jd"),s:t("jd"),b:t("jd<@>"),t:t("jd"),T:t("CD"),m:t("vm"),g:t("c5"),p:t("Xj<@>"),P:t("c8"),K:t("a"),L:t("VY"),F:t("+()"),N:t("qU"),R:t("y5"),D:t("HS"),v:t("Pz"),e:t("zt"),E:t("n6"),o:t("kd"),G:t("YF"),y:t("a2"),i:t("CP"),z:t("@"),S:t("KN"),A:t("0&*"),_:t("a*"),V:t("b8?"),X:t("a?"),H:t("lf")}})();(function constants(){var t=hunkHelpers.makeConstList B.Ok=J.vB.prototype B.Nm=J.jd.prototype B.jn=J.bU.prototype @@ -2366,14 +2690,18 @@ B.fQ=function(hooks) { } B.i7=function(hooks) { return hooks; } +B.Eq=new A.k5() B.zt=new A.zl() -B.Nv=new A.kr() -B.Fa=A.u(t(["`"," ","´","|","·","¨","±","·","_","®","¸"," ","¦","%","*","{","|",".","}","ý","¤","ú","õ","=","ù","@","ø","±","÷","[","$","·","]","Ó","_","¼","½","¾","¿","À","Á","Ã","ó","È","É","Ì","Í","Ñ","Ò","Õ","Ø","Ù","Ú","Ý","à","á","ã","ç","è","é","ì","í","ñ","ò","Ç","ê","´","¤","ô","¦","ó","£","ò","ù","ñ",":","«","î","ø","í","þ","ý","÷","È","ì","¯","¡","±","é","ß","è","µ","ç","·","¸","û","æ",",","»","ú","¼","½","?","¾","¿","À","Á","Â","Ã","Å","Å","Æ","å","Þ","É","Ê","Ì","ã","Í","Î","â","`","Ñ","Ò","á","Ó","Ô","fj","Õ","à","×","õ","Ø","Ù","Ú","Û","Ý","Ç","¯","²","[",";","³","Â","\","+","Ä","å","ô","´","Å","§","Æ","©","µ","]","×","ÿ","¶","¢","Ê","Ë","ä","þ"," ","ü","ö","û","Î","Ï","}","â","©","¸","¡","'","¹","ª","º","ï","Ô","£","»","Ö","«","ë",">⃒","(",""","{","½",")","î","ê","Û","Ü","ß","|","!","<⃒","Þ",""","æ","=⃥","Ö",""","ÿ","ö","Ð","Ï","&","Ë","ä","&","Ä","¹","º","*","¶"," ","#","³","²","­","ü","÷","ë","°","¯","®","®","Ü","¬","ª","ï","ð","©","©","¨","¢","¨","¨","§","/",""","¥"," ","^","Ð","±","°","®","®","­","¬","¨","¥",">",">","<","<","&","&","ð",">",">","<","<"]),u.s) -B.xD=A.u(t([]),u.b) -B.Zn=A.u(t(["`","\xa0","\xb4","|","\xb7","\xa8","\xb1","\xb7","_","\xae","\xb8","\n","\xa6","%","*","{","|",".","}","\xfd","\xa4","\xfa","\xf5","=","\xf9","@","\xf8","\xb1","\xf7","[","$","\xb7","]","\xd3","_","\xbc","\xbd","\xbe","\xbf","\xc0","\xc1","\xc3","\xf3","\xc8","\xc9","\xcc","\xcd","\xd1","\xd2","\xd5","\xd8","\xd9","\xda","\xdd","\xe0","\xe1","\xe3","\xe7","\xe8","\xe9","\xec","\xed","\xf1","\xf2","\xc7","\xea","\xb4","\xa4","\xf4","\xa6","\xf3","\xa3","\xf2","\xf9","\xf1",":","\xab","\xee","\xf8","\xed","\xfe","\xfd","\xf7","\xc8","\xec","\xaf","\xa1","\xb1","\xe9","\xdf","\xe8","\xb5","\xe7","\xb7","\xb8","\xfb","\xe6",",","\xbb","\xfa","\xbc","\xbd","?","\xbe","\xbf","\xc0","\xc1","\xc2","\xc3","\xc5","\xc5","\xc6","\xe5","\xde","\xc9","\xca","\xcc","\xe3","\xcd","\xce","\xe2","`","\xd1","\xd2","\xe1","\xd3","\xd4","f","\xd5","\xe0","\xd7","\xf5","\xd8","\xd9","\xda","\xdb","\xdd","\xc7","\xaf","\xb2","[",";","\xb3","\xc2","\\","+","\xc4","\xe5","\xf4","\xb4","\xc5","\xa7","\xc6","\xa9","\xb5","]","\xd7","\xff","\xb6","\xa2","\xca","\xcb","\xe4","\xfe","\xa0","\xfc","\xf6","\xfb","\xce","\xcf","}","\xe2","\xa9","\xb8","\xa1","'","\xb9","\xaa","\xba","\xef","\xd4","\xa3","\xbb","\xd6","\xab","\xeb",">","(",'"',"{","\xbd",")","\xee","\xea","\xdb","\xdc","\xdf","|","!","<","\xde",'"',"\xe6","=","\xd6",'"',"\xff","\xf6","\xd0","\xcf","&","\xcb","\xe4","&","\xc4","\xb9","\xba","*","\xb6","\xa0","#","\xb3","\xb2","\xad","\xfc","\xf7","\xeb","\xb0","\xaf","\xae","\xae","\xdc","\xac","\xaa","\xef","\xf0","\xa9","\xa9","\xa8","\xa2","\xa8","\xa8","\xa7","/",'"',"\xa5","\t","^","\xd0","\xb1","\xb0","\xae","\xae","\xad","\xac","\xa8","\xa5",">",">","<","<","&","&","\xf0",">",">","<","<"]),u.s) -B.p6={} -B.CM=new A.LP(B.p6,[],A.q7("LP")) -B.Te=new A.wv("call") +B.xM=new A.u5() +B.Qk=new A.E3() +B.TA=A.j(t([0,0,32722,12287,65534,34815,65534,18431]),u.t) +B.IB=A.j(t([0,0,32754,11263,65534,34815,65534,18431]),u.t) +B.Ho=A.j(t([0,0,26624,1023,65534,2047,65534,2047]),u.t) +B.Ji=A.j(t([0,0,32722,12287,65535,34815,65534,18431]),u.t) +B.Fa=A.j(t(["`"," ","´","|","·","¨","±","·","_","®","¸"," ","¦","%","*","{","|",".","}","ý","¤","ú","õ","=","ù","@","ø","±","÷","[","$","·","]","Ó","_","¼","½","¾","¿","À","Á","Ã","ó","È","É","Ì","Í","Ñ","Ò","Õ","Ø","Ù","Ú","Ý","à","á","ã","ç","è","é","ì","í","ñ","ò","Ç","ê","´","¤","ô","¦","ó","£","ò","ù","ñ",":","«","î","ø","í","þ","ý","÷","È","ì","¯","¡","±","é","ß","è","µ","ç","·","¸","û","æ",",","»","ú","¼","½","?","¾","¿","À","Á","Â","Ã","Å","Å","Æ","å","Þ","É","Ê","Ì","ã","Í","Î","â","`","Ñ","Ò","á","Ó","Ô","fj","Õ","à","×","õ","Ø","Ù","Ú","Û","Ý","Ç","¯","²","[",";","³","Â","\","+","Ä","å","ô","´","Å","§","Æ","©","µ","]","×","ÿ","¶","¢","Ê","Ë","ä","þ"," ","ü","ö","û","Î","Ï","}","â","©","¸","¡","'","¹","ª","º","ï","Ô","£","»","Ö","«","ë",">⃒","(",""","{","½",")","î","ê","Û","Ü","ß","|","!","<⃒","Þ",""","æ","=⃥","Ö",""","ÿ","ö","Ð","Ï","&","Ë","ä","&","Ä","¹","º","*","¶"," ","#","³","²","­","ü","÷","ë","°","¯","®","®","Ü","¬","ª","ï","ð","©","©","¨","¢","¨","¨","§","/",""","¥"," ","^","Ð","±","°","®","®","­","¬","¨","¥",">",">","<","<","&","&","ð",">",">","<","<"]),u.s) +B.Eb=A.j(t([0,0,32776,33792,1,10240,0,0]),u.t) +B.fY=A.j(t([0,0,24576,1023,65534,34815,65534,18431]),u.t) +B.Zn=A.j(t(["`","\xa0","\xb4","|","\xb7","\xa8","\xb1","\xb7","_","\xae","\xb8","\n","\xa6","%","*","{","|",".","}","\xfd","\xa4","\xfa","\xf5","=","\xf9","@","\xf8","\xb1","\xf7","[","$","\xb7","]","\xd3","_","\xbc","\xbd","\xbe","\xbf","\xc0","\xc1","\xc3","\xf3","\xc8","\xc9","\xcc","\xcd","\xd1","\xd2","\xd5","\xd8","\xd9","\xda","\xdd","\xe0","\xe1","\xe3","\xe7","\xe8","\xe9","\xec","\xed","\xf1","\xf2","\xc7","\xea","\xb4","\xa4","\xf4","\xa6","\xf3","\xa3","\xf2","\xf9","\xf1",":","\xab","\xee","\xf8","\xed","\xfe","\xfd","\xf7","\xc8","\xec","\xaf","\xa1","\xb1","\xe9","\xdf","\xe8","\xb5","\xe7","\xb7","\xb8","\xfb","\xe6",",","\xbb","\xfa","\xbc","\xbd","?","\xbe","\xbf","\xc0","\xc1","\xc2","\xc3","\xc5","\xc5","\xc6","\xe5","\xde","\xc9","\xca","\xcc","\xe3","\xcd","\xce","\xe2","`","\xd1","\xd2","\xe1","\xd3","\xd4","f","\xd5","\xe0","\xd7","\xf5","\xd8","\xd9","\xda","\xdb","\xdd","\xc7","\xaf","\xb2","[",";","\xb3","\xc2","\\","+","\xc4","\xe5","\xf4","\xb4","\xc5","\xa7","\xc6","\xa9","\xb5","]","\xd7","\xff","\xb6","\xa2","\xca","\xcb","\xe4","\xfe","\xa0","\xfc","\xf6","\xfb","\xce","\xcf","}","\xe2","\xa9","\xb8","\xa1","'","\xb9","\xaa","\xba","\xef","\xd4","\xa3","\xbb","\xd6","\xab","\xeb",">","(",'"',"{","\xbd",")","\xee","\xea","\xdb","\xdc","\xdf","|","!","<","\xde",'"',"\xe6","=","\xd6",'"',"\xff","\xf6","\xd0","\xcf","&","\xcb","\xe4","&","\xc4","\xb9","\xba","*","\xb6","\xa0","#","\xb3","\xb2","\xad","\xfc","\xf7","\xeb","\xb0","\xaf","\xae","\xae","\xdc","\xac","\xaa","\xef","\xf0","\xa9","\xa9","\xa8","\xa2","\xa8","\xa8","\xa7","/",'"',"\xa5","\t","^","\xd0","\xb1","\xb0","\xae","\xae","\xad","\xac","\xa8","\xa5",">",">","<","<","&","&","\xf0",">",">","<","<"]),u.s) B.TE=A.xq("I2") B.hu=A.xq("Wy") B.Wj=A.xq("oI") @@ -2386,7 +2714,7 @@ B.BY=A.xq("HS") B.FN=A.xq("Pz") B.YD=A.xq("zt") B.mj=A.xq("n6")})();(function staticFields(){$.zm=null -$.Qu=A.u([],u.f) +$.Qu=A.j([],u.f) $.xu=null $.i0=null $.Hb=null @@ -2396,9 +2724,11 @@ $.x7=null $.nw=null $.vv=null $.Bv=null -$.Bi=A.u([],A.q7("jd?>")) +$.B=A.j([],A.q7("jd?>")) $.ra=0})();(function lazyInitializers(){var t=hunkHelpers.lazyFinal -t($,"fa","w",()=>A.L("_$dart_dartClosure")) +t($,"fa","w",()=>A.Yg("_$dart_dartClosure")) +t($,"mf","z4",()=>A.nu("^[\\-\\.0-9A-Z_a-z~]*$")) +t($,"Cc","Ob",()=>typeof URLSearchParams=="function") t($,"X0","t8",()=>A.CU(B.ug)) t($,"Zj","Ww",()=>{var s=new A.lM() s.U() @@ -2416,7 +2746,7 @@ break}}v.dispatchPropertyName=v.getIsolateTag("dispatch_record")}() hunkHelpers.setOrUpdateInterceptorsByTag({ArrayBuffer:A.WZ,ArrayBufferView:A.eH,DataView:A.df,Float32Array:A.zU,Float64Array:A.K8,Int16Array:A.xj,Int32Array:A.dE,Int8Array:A.ZA,Uint16Array:A.wf,Uint32Array:A.Pq,Uint8ClampedArray:A.eE,CanvasPixelArray:A.eE,Uint8Array:A.V6}) hunkHelpers.setOrUpdateLeafTags({ArrayBuffer:true,ArrayBufferView:false,DataView:true,Float32Array:true,Float64Array:true,Int16Array:true,Int32Array:true,Int8Array:true,Uint16Array:true,Uint32Array:true,Uint8ClampedArray:true,CanvasPixelArray:true,Uint8Array:false}) A.b0.$nativeSuperclassTag="ArrayBufferView" -A.VR.$nativeSuperclassTag="ArrayBufferView" +A.RG.$nativeSuperclassTag="ArrayBufferView" A.vX.$nativeSuperclassTag="ArrayBufferView" A.Dg.$nativeSuperclassTag="ArrayBufferView" A.WB.$nativeSuperclassTag="ArrayBufferView" diff --git a/src/content/cookbook/animation/page-route-animation.md b/src/content/cookbook/animation/page-route-animation.md index 9948b21cff..b2b04cea7f 100644 --- a/src/content/cookbook/animation/page-route-animation.md +++ b/src/content/cookbook/animation/page-route-animation.md @@ -159,11 +159,11 @@ full height of the page. The `transitionsBuilder` callback has an `animation` parameter. It's an `Animation` that produces values between 0 and 1. Convert the -Animation into an Animation using a Tween: +`Animation` into an `Animation` using a Tween: `transitionsBuilder` 的回调有一个 `animation` 参数。 它其实是一个 `Animation`,提供 0 到 1 的值。 -使用 Tween 来将 Animation 转为 Animation。 +使用 Tween 来将 `Animation` 转为 `Animation`。 ```dart diff --git a/src/content/cookbook/effects/nested-nav.md b/src/content/cookbook/effects/nested-nav.md index c16f1dcc56..6f5e41be36 100644 --- a/src/content/cookbook/effects/nested-nav.md +++ b/src/content/cookbook/effects/nested-nav.md @@ -129,7 +129,7 @@ for each of the three top-level paths. ```dart onGenerateRoute: (settings) { - late Widget page; + final Widget page; if (settings.name == routeHome) { page = const HomeScreen(); } else if (settings.name == routeSettings) { @@ -524,7 +524,7 @@ Run the app: 按下 **Finish** 按钮返回第一页。 -```dartpad title="Flutter nested navigation hands-on example in DartPad" run="true" +```dartpad title="Flutter nested navigation hands-on example in DartPad" run="true" height="640px" import 'package:flutter/material.dart'; const routeHome = '/'; @@ -549,7 +549,7 @@ void main() { ), ), onGenerateRoute: (settings) { - late Widget page; + final Widget page; if (settings.name == routeHome) { page = const HomeScreen(); } else if (settings.name == routeSettings) { @@ -825,56 +825,58 @@ class FinishedPage extends StatelessWidget { body: Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 24), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 250, - height: 250, - decoration: const BoxDecoration( - shape: BoxShape.circle, - color: Color(0xFF222222), - ), - child: const Center( - child: Icon( - Icons.lightbulb, - size: 175, - color: Colors.white, + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 200, + height: 200, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: Color(0xFF222222), + ), + child: const Center( + child: Icon( + Icons.lightbulb, + size: 140, + color: Colors.white, + ), ), ), - ), - const SizedBox(height: 32), - const Text( - 'Bulb added!', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 24, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 32), - ElevatedButton( - style: ButtonStyle( - padding: WidgetStateProperty.resolveWith((states) { - return const EdgeInsets.symmetric( - horizontal: 24, vertical: 12); - }), - backgroundColor: WidgetStateColor.resolveWith((states) { - return const Color(0xFF222222); - }), - shape: WidgetStateProperty.resolveWith((states) { - return const StadiumBorder(); - }), - ), - onPressed: onFinishPressed, - child: const Text( - 'Finish', + const SizedBox(height: 32), + const Text( + 'Bulb added!', + textAlign: TextAlign.center, style: TextStyle( fontSize: 24, + fontWeight: FontWeight.bold, ), ), - ), - ], + const SizedBox(height: 32), + ElevatedButton( + style: ButtonStyle( + padding: WidgetStateProperty.resolveWith((states) { + return const EdgeInsets.symmetric( + horizontal: 24, vertical: 12); + }), + backgroundColor: WidgetStateColor.resolveWith((states) { + return const Color(0xFF222222); + }), + shape: WidgetStateProperty.resolveWith((states) { + return const StadiumBorder(); + }), + ), + onPressed: onFinishPressed, + child: const Text( + 'Finish', + style: TextStyle( + fontSize: 24, + ), + ), + ), + ], + ), ), ), ), @@ -899,8 +901,8 @@ class HomeScreen extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Container( - width: 250, - height: 250, + width: 200, + height: 200, decoration: const BoxDecoration( shape: BoxShape.circle, color: Color(0xFF222222), @@ -908,7 +910,7 @@ class HomeScreen extends StatelessWidget { child: Center( child: Icon( Icons.lightbulb, - size: 175, + size: 140, color: Theme.of(context).scaffoldBackgroundColor, ), ), diff --git a/src/content/cookbook/navigation/set-up-app-links.md b/src/content/cookbook/navigation/set-up-app-links.md index 0fadec9543..2dc8c48813 100644 --- a/src/content/cookbook/navigation/set-up-app-links.md +++ b/src/content/cookbook/navigation/set-up-app-links.md @@ -1,13 +1,10 @@ --- title: Set up app links for Android -description: How set up universal links for an iOS application built with Flutter -js: - - defer: true - url: /assets/js/inject_dartpad.js +description: >- + Learn how to set up app links for an + Android application built with Flutter. --- - - Deep linking is a mechanism for launching an app with a URI. This URI contains scheme, host, and path, and opens the app to a specific screen. @@ -21,7 +18,7 @@ Learn more and see a demo at [Validate deep links][]. [Validate deep links]: /tools/devtools/deep-links -A _app link_ is a type of deep link that uses +An _app link_ is a type of deep link that uses `http` or `https` and is exclusive to Android devices. Setting up app links requires one to own a web domain. @@ -35,14 +32,14 @@ This example uses the [go_router][] package to handle the routing. The Flutter team maintains the `go_router` package. It provides a simple API to handle complex routing scenarios. -1. To create a new application, type `flutter create `: + 1. To create a new application, type `flutter create `: - ```shell + ```console $ flutter create deeplink_cookbook ``` -2. To include `go_router` package in your app, - add a dependency for `go_router` to the project: + 2. To include `go_router` package in your app, + add a dependency for `go_router` to the project: To add the `go_router` package as a dependency, run `flutter pub add`: @@ -51,11 +48,10 @@ It provides a simple API to handle complex routing scenarios. $ flutter pub add go_router ``` -3. To handle the routing, - create a `GoRouter` object in the `main.dart` file: + 3. To handle the routing, + create a `GoRouter` object in the `main.dart` file: - - ```dartpad title="Flutter GoRouter hands-on example in DartPad" run="true" + ```dart title="main.dart" import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; @@ -84,9 +80,9 @@ It provides a simple API to handle complex routing scenarios. ## 2. Modify AndroidManifest.xml -1. Open the Flutter project with VS Code or Android Studio. -2. Navigate to `android/app/src/main/AndroidManifest.xml` file. -3. Add the following metadata tag and intent filter inside the + 1. Open the Flutter project with VS Code or Android Studio. + 2. Navigate to `android/app/src/main/AndroidManifest.xml` file. + 3. Add the following metadata tag and intent filter inside the `` tag with `.MainActivity`. Replace `example.com` with your own web domain. @@ -102,14 +98,14 @@ It provides a simple API to handle complex routing scenarios. ``` - :::note - The metadata tag flutter_deeplinking_enabled opts - into Flutter's default deeplink handler. - If you are using the third-party plugins, - such as [uni_links][], setting this metadata tag will - break these plugins. Omit this metadata tag - if you prefer to use third-party plugins. - ::: + :::note + The metadata tag `flutter_deeplinking_enabled` opts + into Flutter's default deeplink handler. + If you are using the third-party plugins, + such as [uni_links][], setting this metadata tag will + break these plugins. Omit this metadata tag + if you prefer to use third-party plugins. + ::: ## 3. Hosting assetlinks.json file @@ -164,15 +160,15 @@ The hosted file should look similar to this: }] ``` -1. Set the `package_name` value to your Android application ID. + 1. Set the `package_name` value to your Android application ID. -2. Set sha256_cert_fingerprints to the value you got - from the previous step. + 2. Set sha256_cert_fingerprints to the value you got + from the previous step. -3. Host the file at a URL that resembles the following: - `/.well-known/assetlinks.json` + 3. Host the file at a URL that resembles the following: + `/.well-known/assetlinks.json` -4. Verify that your browser can access this file. + 4. Verify that your browser can access this file. :::note If you have multiple flavors, you can have many sha256_cert_fingerprint diff --git a/src/content/cookbook/navigation/set-up-universal-links.md b/src/content/cookbook/navigation/set-up-universal-links.md index 8f52f8f074..b9ddfd8adc 100644 --- a/src/content/cookbook/navigation/set-up-universal-links.md +++ b/src/content/cookbook/navigation/set-up-universal-links.md @@ -1,13 +1,10 @@ --- title: Set up universal links for iOS -description: How set up universal links for an iOS application built with Flutter -js: - - defer: true - url: /assets/js/inject_dartpad.js +description: >- + Learn how to set up universal links for an + iOS application built with Flutter. --- - - Deep linking allows an app user to launch an app with a URI. This URI contains scheme, host, and path, and opens the app to a specific screen. @@ -38,7 +35,7 @@ It provides a simple API to handle complex routing scenarios. 1. To create a new application, type `flutter create `. - ```shell + ```console $ flutter create deeplink_cookbook ``` @@ -51,8 +48,7 @@ It provides a simple API to handle complex routing scenarios. 3. To handle the routing, create a `GoRouter` object in the `main.dart` file: - - ```dartpad title="Flutter GoRouter hands-on example in DartPad" run="true" + ```dart title="main.dart" import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; @@ -90,8 +86,7 @@ It provides a simple API to handle complex routing scenarios. 1. In the Xcode Navigator, expand **Runner** then click **Info**. - Xcode info.Plist screenshot @@ -111,7 +106,7 @@ It provides a simple API to handle complex routing scenarios. flutter deeplinking enabled screenshot :::note @@ -162,7 +157,7 @@ capability. To add associated domains, choose the IDE tab. {% endtab %} {% tab "Other editors" %} -1. Open the `ios/Runner/Runner.entitlements` XML file in your preferred IDE. +1. Open the `ios/Runner/Runner.entitlements` XML file in your preferred editor. 1. Add an associated domain inside the `` tag. @@ -181,8 +176,8 @@ capability. To add associated domains, choose the IDE tab. 1. Save the `ios/Runner/Runner.entitlements` file. -To check that the associated domains you created are available, perform -the following steps. +To check that the associated domains you created are available, +perform the following steps: 1. Launch Xcode if necessary. @@ -207,8 +202,10 @@ You have finished configuring the application for deep linking. ## Associate your app with your web domain You need to host an `apple-app-site-association` file in the web domain. -This file tells the mobile browser which iOS application to open instead of the browser. -To create the file, find the `appID` of the Flutter app you created in the previous section. +This file tells the mobile browser which +iOS application to open instead of the browser. +To create the file, find the `appID` of the Flutter app you +created in the previous section. ### Locate components of the `appID` @@ -273,8 +270,8 @@ this file should resemble the following content: 1. Verify that your browser can access this file. :::note -If you have more than one scheme/flavor, you can add more than one appID -into appIDs fields +If you have more than one scheme/flavor, you can +add more than one `appID` into the `appIDs` field. ::: ## Test the universal link @@ -282,8 +279,7 @@ into appIDs fields Test a universal link using a physical iOS device or the Simulator. :::note -It might take up to 24 hours before Apple's -[Content Delivery Network](https://en.wikipedia.org/wiki/Content_delivery_network) (CDN) +It might take up to 24 hours before Apple's [Content Delivery Network][] (CDN) requests the `apple-app-site-association` (AASA) file from your web domain. Until the CDN requests the file, the universal link won't work. To bypass Apple's CDN, check out the [alternate mode section][]. @@ -321,6 +317,8 @@ To bypass Apple's CDN, check out the [alternate mode section][]. alt="Deeplinked Simulator screenshot" width="50%" /> +[Content Delivery Network]: https://en.wikipedia.org/wiki/Content_delivery_network + ## Find the source code You can find the source code for the [deeplink_cookbook][] diff --git a/src/content/cookbook/networking/update-data.md b/src/content/cookbook/networking/update-data.md index a6ed8d5478..c1873008c0 100644 --- a/src/content/cookbook/networking/update-data.md +++ b/src/content/cookbook/networking/update-data.md @@ -154,7 +154,7 @@ Future updateAlbum(String title) async { Hooray! Now you've got a function that updates the title of an album. -### 4. Get the data from the internet +### Get the data from the internet Get the data from internet before you can update it. For a complete example, see the [Fetch data][] recipe. @@ -182,7 +182,7 @@ Ideally, you will use this method to set `_futureAlbum` during `initState` to fetch the data from the internet. -## 5. Update the existing title from user input +## 4. Update the existing title from user input Create a `TextField` to enter a title and a `ElevatedButton` to update the data on server. diff --git a/src/content/deployment/flavors.md b/src/content/deployment/flavors.md index 53c5d70da6..e6aa4b5731 100644 --- a/src/content/deployment/flavors.md +++ b/src/content/deployment/flavors.md @@ -311,7 +311,7 @@ the following resources: * [Build flavors in Flutter (Android and iOS) with different Firebase projects per flavor Flutter Ready to Go][] * [Flavoring Flutter Applications (Android & iOS)][] -* [Flutter Flavors Setup with multiple Firebase Environments using FlutterFire and Very Good CLI][] +* [How to Setup Flutter & Firebase with Multiple Flavors using the FlutterFire CLI][flutterfireCLI] ### Packages @@ -330,6 +330,6 @@ For packages that support creating flavors, check out the following: [Adding assets and images]: /ui/assets/assets-and-images [Build flavors in Flutter (Android and iOS) with different Firebase projects per flavor Flutter Ready to Go]: {{site.medium}}/@animeshjain/build-flavors-in-flutter-android-and-ios-with-different-firebase-projects-per-flavor-27c5c5dac10b [Flavoring Flutter Applications (Android & iOS)]: {{site.medium}}/flutter-community/flavoring-flutter-applications-android-ios-ea39d3155346 -[Flutter Flavors Setup with multiple Firebase Environments using FlutterFire and Very Good CLI]: https://codewithandrea.com/articles/flutter-flavors-for-firebase-apps/ +[flutterfireCLI]: https://codewithandrea.com/articles/flutter-firebase-multiple-flavors-flutterfire-cli/ [`flutter_flavor`]: {{site.pub}}/packages/flutter_flavor [`flutter_flavorizr`]: {{site.pub}}/packages/flutter_flavorizr diff --git a/src/content/get-started/codelab-web.md b/src/content/get-started/codelab-web.md index 5780ab03a3..f56bd36a88 100644 --- a/src/content/get-started/codelab-web.md +++ b/src/content/get-started/codelab-web.md @@ -1171,7 +1171,7 @@ class _AnimatedProgressIndicatorState extends State } @override - void didUpdateWidget(oldWidget) { + void didUpdateWidget(AnimatedProgressIndicator oldWidget) { super.didUpdateWidget(oldWidget); _controller.animateTo(widget.value); } @@ -1436,7 +1436,7 @@ class _AnimatedProgressIndicatorState extends State } @override - void didUpdateWidget(oldWidget) { + void didUpdateWidget(AnimatedProgressIndicator oldWidget) { super.didUpdateWidget(oldWidget); _controller.animateTo(widget.value); } diff --git a/src/content/get-started/codelab.md b/src/content/get-started/codelab.md index 1dd89ffd98..b2e2311663 100644 --- a/src/content/get-started/codelab.md +++ b/src/content/get-started/codelab.md @@ -8,9 +8,9 @@ short-title: 编写第一个 Flutter 应用 tags: Flutter安装,Flutter起步教程 keywords: Flutter 第一个应用,Flutter Hello World,codelab prev: - # title: Test drive - title: 开发体验初探 - path: /get-started/test-drive + # title: Set up Flutter + title: 安装和环境配置 + path: /get-started/install next: # title: Learn more title: 了解更多 diff --git a/src/content/get-started/editor.md b/src/content/get-started/editor.md index d989f4f37e..af44d83c27 100644 --- a/src/content/get-started/editor.md +++ b/src/content/get-started/editor.md @@ -6,13 +6,13 @@ description: 为 Flutter 配置 IDE 环境。 tags: Flutter安装,Flutter起步教程 keywords: Flutter编辑工具,IDE配置 prev: -# title: Install +# title: Set up Flutter title: 安装和环境配置 path: /get-started/install next: -# title: Test drive - title: 开发体验初探 - path: /get-started/test-drive +# title: Create your first app + title: 编写你的第一个应用 + path: /get-started/codelab toc: false --- @@ -54,10 +54,12 @@ Android Studio, or IntelliJ. 参考以下步骤为 VS Code、Android Studio 或者 IntelliJ 添加编辑器插件。 If you choose another IDE, skip ahead -to the [next step: Test drive](/get-started/test-drive). +to [Write your first Flutter app][]. 如果你想使用其他的编辑器,请前往 -[下一节: 开发体验初探](/get-started/test-drive)。 +[编写你的第一个 Flutter 应用][Write your first Flutter app]。 + +[Write your first Flutter app]: /get-started/codelab {% tabs %} {% tab "Visual Studio Code" %} diff --git a/src/content/get-started/flutter-for/android-devs.md b/src/content/get-started/flutter-for/android-devs.md index aa421f564a..264411914b 100644 --- a/src/content/get-started/flutter-for/android-devs.md +++ b/src/content/get-started/flutter-for/android-devs.md @@ -1246,10 +1246,10 @@ Future loadData() async { // The 'echo' isolate sends its SendPort as the first message. SendPort sendPort = await receivePort.first; - List msg = await sendReceive( + final msg = await sendReceive( sendPort, 'https://jsonplaceholder.typicode.com/posts', - ); + ) as List; setState(() { widgets = msg; @@ -1275,7 +1275,7 @@ static Future dataLoader(SendPort sendPort) async { } } -Future sendReceive(SendPort port, msg) { +Future sendReceive(SendPort port, Object? msg) { ReceivePort response = ReceivePort(); port.send([msg, response.sendPort]); return response.first; @@ -1387,10 +1387,10 @@ class _SampleAppPageState extends State { // The 'echo' isolate sends its SendPort as the first message. SendPort sendPort = await receivePort.first; - List msg = await sendReceive( + final msg = await sendReceive( sendPort, 'https://jsonplaceholder.typicode.com/posts', - ); + ) as List; setState(() { widgets = msg; @@ -1416,7 +1416,7 @@ class _SampleAppPageState extends State { } } - Future sendReceive(SendPort port, msg) { + Future sendReceive(SendPort port, Object? msg) { ReceivePort response = ReceivePort(); port.send([msg, response.sendPort]); return response.first; diff --git a/src/content/get-started/flutter-for/dart-swift-concurrency.md b/src/content/get-started/flutter-for/dart-swift-concurrency.md index 1b5dd8e70f..2c4101d8ce 100644 --- a/src/content/get-started/flutter-for/dart-swift-concurrency.md +++ b/src/content/get-started/flutter-for/dart-swift-concurrency.md @@ -245,7 +245,7 @@ class HomePage extends StatelessWidget { For the complete example, check out the [async_weather][] file on GitHub. -[async_weather]: {{site.repo.this}}/examples/resources/lib/async_weather.dart +[async_weather]: {{site.repo.this}}/examples/resources/dart_swift_concurrency/lib/async_weather.dart ### Leveraging a background thread/isolate diff --git a/src/content/get-started/flutter-for/swiftui-devs.md b/src/content/get-started/flutter-for/swiftui-devs.md index eaced7f5ce..85b55d145b 100644 --- a/src/content/get-started/flutter-for/swiftui-devs.md +++ b/src/content/get-started/flutter-for/swiftui-devs.md @@ -393,7 +393,7 @@ class Person { Person(this.name); } -var items = [ +final List items = [ Person('Person 1'), Person('Person 2'), Person('Person 3'), diff --git a/src/content/get-started/flutter-for/web-devs.md b/src/content/get-started/flutter-for/web-devs.md index abf378d0d9..1fcbe310f5 100644 --- a/src/content/get-started/flutter-for/web-devs.md +++ b/src/content/get-started/flutter-for/web-devs.md @@ -588,6 +588,7 @@ The gradient "angle" is based on the Alignment (x, y) values: #### 垂直变换 ```css highlightLines=19 +
Lorem ipsum
@@ -715,6 +716,7 @@ object that specifies the radius for rounding each corner. 新建一个 [`BorderRadius`][] 对象来指定各个圆角的半径大小。 ```css highlightLines=20 +
Lorem ipsum
@@ -789,6 +791,7 @@ to customize the shadow depth, color, and so on. 这些 widget 共同用于设置阴影深度、颜色等等。 ```css highlightLines=20-21 +
Lorem ipsum
@@ -871,6 +874,7 @@ Flutter 提供了一个 `shape` 属性用于实现同样的目的, 它的类型是 [`BoxShape` 枚举][`BoxShape` enum]。 ```css highlightLines=20-23 +
Lorem ipsum
@@ -896,7 +900,7 @@ Flutter 提供了一个 `shape` 属性用于实现同样的目的, } ``` -```dart highlightLines=10,13-14,18 +```dart highlightLines=11,14-15,19 final container = Container( // grey box width: 320, @@ -1030,6 +1034,7 @@ and "ipsum" is in a separate `TextSpan` with custom styling. 「ipsum」位于具有自定义样式、单独的一个 `TextSpan` 中。 ```css highlightLines=3,11,21-4 +
Lorem ipsum
@@ -1108,6 +1113,7 @@ and the `overflow` property for handling overflow text. 以及 `overflow` 属性来处理溢出文本。 ```css highlightLines=20-23 +
Lorem ipsum dolor sit amet, consec etur
diff --git a/src/content/get-started/fundamentals/index.md b/src/content/get-started/fundamentals/index.md index 52a6ab8092..7cdc9a52d3 100644 --- a/src/content/get-started/fundamentals/index.md +++ b/src/content/get-started/fundamentals/index.md @@ -7,7 +7,12 @@ description: > toc: false --- -## Welcome to the next level of Flutter! + + +
+
+ +## Find your way with Flutter! If you are new to Flutter, and have already worked through [your first Flutter codelab][], @@ -18,6 +23,14 @@ steps of learning Flutter. It's not about teaching you how to _program_, it's about teaching you how Flutter works. + +
+
+ {% render docs/app-figure.md, img-class:"w-75", image:"fwe/dash-search.png", alt:"Dash with magnifying glass" %} +
+
+ + :::note These fundamentals docs are still a work in progress and we welcome your feedback! diff --git a/src/content/get-started/fundamentals/layout.md b/src/content/get-started/fundamentals/layout.md index d0770e7b79..16a7832d95 100644 --- a/src/content/get-started/fundamentals/layout.md +++ b/src/content/get-started/fundamentals/layout.md @@ -5,8 +5,8 @@ prev: title: Widgets path: /get-started/fundamentals/widgets next: - title: State management - path: /get-started/fundamentals/state-management + title: State management + path: /get-started/fundamentals/state-management --- Given that Flutter is a UI toolkit, @@ -22,6 +22,7 @@ Flutter's most common layout errors, the dreaded "unbounded constraints" error. ## Understanding layout in Flutter + The core of Flutter's layout mechanism is widgets. In Flutter, almost everything is a widget — even layout models are widgets. @@ -287,7 +288,7 @@ before, and after each image. {% render docs/code-and-image.md, image:"fwe/layout/space_evenly.png", -caption: "This figure shows a row widget with three children, which are aligned with the crossAxisAlignment.spaceEvenly constant." +caption: "This figure shows a row widget with three children, which are aligned with the MainAxisAlignment.spaceEvenly constant." alt: "A screenshot of three widgets, spaced evenly from each other." code:" ```dart @@ -501,7 +502,7 @@ and therefore the number of todos is unknown. {% render docs/code-and-image.md, image:"fwe/layout/listview_builder.png", -caption: "This figure shows the ListView.builder constuctor to display an unknown number of children." +caption: "This figure shows the ListView.builder constructor to display an unknown number of children." alt: "A screenshot of several widgets laid out vertically. They have expanded to take up all available space on the cross axis." code:" ```dart diff --git a/src/content/get-started/fundamentals/state-management.md b/src/content/get-started/fundamentals/state-management.md index 78f93e86ca..a83dd713c3 100644 --- a/src/content/get-started/fundamentals/state-management.md +++ b/src/content/get-started/fundamentals/state-management.md @@ -2,7 +2,7 @@ title: State management description: Learn how to manage state in Flutter. prev: - title: Layouts + title: Layout path: /get-started/fundamentals/layout next: title: Handling user input diff --git a/src/content/get-started/fundamentals/widgets.md b/src/content/get-started/fundamentals/widgets.md index 86240f176d..99712f56e0 100644 --- a/src/content/get-started/fundamentals/widgets.md +++ b/src/content/get-started/fundamentals/widgets.md @@ -5,7 +5,7 @@ prev: title: Intro to Dart path: /get-started/fundamentals/dart next: - title: Layouts + title: Layout path: /get-started/fundamentals/layout --- diff --git a/src/content/get-started/install/chromeos/android.md b/src/content/get-started/install/chromeos/android.md index 0be0a35b4f..2365e3fff1 100644 --- a/src/content/get-started/install/chromeos/android.md +++ b/src/content/get-started/install/chromeos/android.md @@ -6,8 +6,8 @@ target: Android config: ChromeOSAndroid devos: ChromeOS next: - title: Create a test app - path: /get-started/test-drive + title: Create your first app + path: /get-started/codelab --- {% include docs/install/reqs/linux/base.md os=devos target=target %} diff --git a/src/content/get-started/install/chromeos/web.md b/src/content/get-started/install/chromeos/web.md index dd278514e2..3183038d81 100644 --- a/src/content/get-started/install/chromeos/web.md +++ b/src/content/get-started/install/chromeos/web.md @@ -6,8 +6,8 @@ target: Web config: ChromeOSWeb devos: ChromeOS next: - title: Create a test app - path: /get-started/test-drive + title: Create your first app + path: /get-started/codelab --- {% include docs/install/reqs/linux/base.md os=devos target=target %} diff --git a/src/content/get-started/install/linux/android.md b/src/content/get-started/install/linux/android.md index 94dc0d544f..0a2dc82cc0 100644 --- a/src/content/get-started/install/linux/android.md +++ b/src/content/get-started/install/linux/android.md @@ -6,8 +6,8 @@ target: Android config: LinuxAndroid devos: Linux next: - title: Create a test app - path: /get-started/test-drive + title: Create your first app + path: /get-started/codelab --- {% include docs/install/reqs/linux/base.md os=devos target=target %} diff --git a/src/content/get-started/install/linux/desktop.md b/src/content/get-started/install/linux/desktop.md index 9ff676696d..6d70ba9573 100644 --- a/src/content/get-started/install/linux/desktop.md +++ b/src/content/get-started/install/linux/desktop.md @@ -6,8 +6,8 @@ target: desktop config: LinuxDesktop devos: Linux next: - title: Create a test app - path: /get-started/test-drive + title: Create your first app + path: /get-started/codelab --- {% include docs/install/reqs/linux/base.md os=devos target=target %} diff --git a/src/content/get-started/install/linux/web.md b/src/content/get-started/install/linux/web.md index f3c3df4400..e85e626f51 100644 --- a/src/content/get-started/install/linux/web.md +++ b/src/content/get-started/install/linux/web.md @@ -6,8 +6,8 @@ target: Web config: LinuxWeb devos: Linux next: - title: Create a test app - path: /get-started/test-drive + title: Create your first app + path: /get-started/codelab --- {% include docs/install/reqs/linux/base.md os=devos target=target %} diff --git a/src/content/get-started/install/macos/desktop.md b/src/content/get-started/install/macos/desktop.md index 912b8fb485..b059d61216 100644 --- a/src/content/get-started/install/macos/desktop.md +++ b/src/content/get-started/install/macos/desktop.md @@ -9,9 +9,9 @@ target: desktop config: macOSDesktop devos: macOS next: - # title: Create a test app - title: 开发体验初探 - path: /get-started/test-drive + # title: Create your first app + title: 编写你的第一个应用 + path: /get-started/codelab --- {% include docs/install/reqs/macos/base.md os=devos target=target %} diff --git a/src/content/get-started/install/macos/mobile-android.md b/src/content/get-started/install/macos/mobile-android.md index 17242cc3dc..b1ebb91f2c 100644 --- a/src/content/get-started/install/macos/mobile-android.md +++ b/src/content/get-started/install/macos/mobile-android.md @@ -9,9 +9,9 @@ target: Android config: macOSAndroid devos: macOS next: - # title: Create a test app - title: 开发体验初探 - path: /get-started/test-drive + # title: Create your first app + title: 编写你的第一个应用 + path: /get-started/codelab --- {% include docs/install/reqs/macos/base.md os=devos target=target %} diff --git a/src/content/get-started/install/macos/mobile-ios.md b/src/content/get-started/install/macos/mobile-ios.md index 5886ec1c7c..a40efc6fb7 100644 --- a/src/content/get-started/install/macos/mobile-ios.md +++ b/src/content/get-started/install/macos/mobile-ios.md @@ -9,9 +9,9 @@ target: iOS config: macOSiOS devos: macOS next: - # title: Create a test app - title: 开发体验初探 - path: /get-started/test-drive + # title: Create your first app + title: 编写你的第一个应用 + path: /get-started/codelab --- {% include docs/install/reqs/macos/base.md os=devos target=target %} diff --git a/src/content/get-started/install/macos/web.md b/src/content/get-started/install/macos/web.md index 0ea174ff85..03e570cb58 100644 --- a/src/content/get-started/install/macos/web.md +++ b/src/content/get-started/install/macos/web.md @@ -9,9 +9,9 @@ target: web config: macOSWeb devos: macOS next: - # title: Create a test app - title: 开发体验初探 - path: /get-started/test-drive + # title: Create your first app + title: 编写你的第一个应用 + path: /get-started/codelab --- {% include docs/install/reqs/macos/base.md os=devos target=target %} diff --git a/src/content/get-started/install/windows/desktop.md b/src/content/get-started/install/windows/desktop.md index f85150fe2e..ad0dbf6673 100644 --- a/src/content/get-started/install/windows/desktop.md +++ b/src/content/get-started/install/windows/desktop.md @@ -9,9 +9,9 @@ target: desktop config: WindowsDesktop devos: Windows next: - # title: Create a test app - title: 开发体验初探 - path: /get-started/test-drive + # title: Create your first app + title: 编写你的第一个应用 + path: /get-started/codelab --- {% include docs/install/reqs/windows/base.md os=devos target=target %} diff --git a/src/content/get-started/install/windows/mobile.md b/src/content/get-started/install/windows/mobile.md index e365c43cb3..d1915503b8 100644 --- a/src/content/get-started/install/windows/mobile.md +++ b/src/content/get-started/install/windows/mobile.md @@ -9,9 +9,9 @@ target: Android config: WindowsAndroid devos: Windows next: - # title: Create a test app - title: 开发体验初探 - path: /get-started/test-drive + # title: Create your first app + title: 编写你的第一个应用 + path: /get-started/codelab --- {% include docs/install/reqs/windows/base.md os=devos target=target %} diff --git a/src/content/get-started/install/windows/web.md b/src/content/get-started/install/windows/web.md index e45917919a..397ead1219 100644 --- a/src/content/get-started/install/windows/web.md +++ b/src/content/get-started/install/windows/web.md @@ -9,9 +9,9 @@ target: web config: WindowsWeb devos: Windows next: - # title: Create a test app - title: 开发体验初探 - path: /get-started/test-drive + # title: Create your first app + title: 编写你的第一个应用 + path: /get-started/codelab --- {% include docs/install/reqs/windows/base.md os=devos target=target %} diff --git a/src/content/get-started/test-drive/index.md b/src/content/get-started/test-drive/index.md index 15252d4b31..f6b7dc6982 100644 --- a/src/content/get-started/test-drive/index.md +++ b/src/content/get-started/test-drive/index.md @@ -6,7 +6,7 @@ description: 如何使用 hot reload 创建一个 Flutter 应用模版。 tags: Flutter安装,Flutter环境搭建 keywords: Flutter IDE,Flutter编辑器,Android Studio,VS Code,Flutter插件 prev: - # title: Install Flutter + # title: Set up Flutter title: 安装和环境配置 path: /get-started/install next: diff --git a/src/content/perf/ui-performance.md b/src/content/perf/ui-performance.md index 7799ac51a6..9e86bf9b8a 100644 --- a/src/content/perf/ui-performance.md +++ b/src/content/perf/ui-performance.md @@ -551,7 +551,7 @@ The [`saveLayer`][] method is one of the most expensive methods in the Flutter framework. It's useful when applying post-processing to the scene, but it can slow your app and should be avoided if you don't need it. Even if you don't call `saveLayer` explicitly, -implicit calls might happen on your behalf, for example when specyifying +implicit calls might happen on your behalf, for example when specifying [`Clip.antiAliasWithSaveLayer`][] (typically as a `clipBehavior`). [`saveLayer`][] 方法是 Flutter 框架中特别消耗性能的操作之一。 diff --git a/src/content/platform-integration/android/compose-activity.md b/src/content/platform-integration/android/compose-activity.md new file mode 100644 index 0000000000..2fb9e4d6ee --- /dev/null +++ b/src/content/platform-integration/android/compose-activity.md @@ -0,0 +1,295 @@ +--- +title: Launching a Jetpack Compose activity from your Flutter application +short-title: Native Android activities +description: >- + Learn how to launch native Android activities in your Flutter app. +--- + + + +Native Android activities allow you to launch +fullscreen UIs that are entirely run by and on the Android platform. +You will only write Kotlin code in those views (though they might +pass messages to and receive messages from your Dart code) and +you will have access to the full breadth of native Android functionality. + +Adding this functionality requires making several changes to +your Flutter app and its internal, generated Android app. +On the Flutter side, you will need to create a new +platform method channel and call its `invokeMethod` method. +On the Android side, you will need to register a matching native `MethodChannel` +to receive the signal from Dart and then launch a new activity. +Recall that all Flutter apps (when running on Android) exist within +an Android activity that is completely consumed by the Flutter app. +Thus, as you will see in the code sample, the job of the +native `MethodChannel` callback is to launch a second activity. + +:::note +This page discusses how to launch native Android activities +within a Flutter app. +If you'd like to host native Android views in your Flutter app, +check out [Hosting native Android views][]. +::: + +[Hosting native Android views]: /platform-integration/android/platform-views + +Not all Android activities use Jetpack Compose, but +this tutorial assumes you want to use Compose. + +## On the Dart side + +On the Dart side, create a method channel and invoke it from +a specific user interaction, like tapping a button. + + +```dart +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +// SECTION 1: START COPYING HERE +const platformMethodChannel = MethodChannel( + // Note: You can change this string value, but it must match + // the `CHANNEL` attribute in the next step. + 'com.example.flutter_android_activity', +); +// SECTION 1: END COPYING HERE + +void main() { + runApp(const MainApp()); +} + +class MainApp extends StatelessWidget { + const MainApp({super.key}); + + // SECTION 2: START COPYING HERE + void _launchAndroidActivity() { + platformMethodChannel.invokeMethod( + // Note: You can change this value, but it must match + // the `call.method` value in the next section. + 'launchActivity', + + // Note: You can pass any primitive data types you like. + // To pass complex types, use package:pigeon to generate + // matching Dart and Kotlin classes that share serialization logic. + {'message': 'Hello from Flutter'}, + ); + } + // SECTION 2: END COPYING HERE + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + body: const Center( + child: Text('Hello World!'), + ), + floatingActionButton: FloatingActionButton( + // SECTION 3: Call `_launchAndroidActivity` somewhere. + onPressed: _launchAndroidActivity, + // SECTION 3: End + + tooltip: 'Launch Android activity', + child: const Icon(Icons.launch), + ), + ), + ); + } +} +``` + +There are 3 important values that must match across your Dart and Kotlin code: + + 1. The channel name (in this sample, the value is + `"com.example.flutter_android_activity"`). + 2. The method name (in this sample, the value is `"launchActivity"`). + 3. The structure of the data which Dart passes and + the structure of the data which Kotlin expects to receive. + In this case, the data is a map with a single `"message"` key. + + +## On the Android side + +You must make changes to 4 files in the generated Android app to +ready it for launching fresh Compose activities. + +The first file requiring modifications is `android/app/build.gradle`. + + 1. Add the following to the existing `android` block: + + ```groovy title="android/app/build.gradle" + android { + // Begin adding here + buildFeatures { + compose true + } + composeOptions { + // https://developer.android.com/jetpack/androidx/releases/compose-kotlin + kotlinCompilerExtensionVersion = "1.4.8" + } + // End adding here + } + ``` + + Visit the [developer.android.com][] link in the code snippet and + adjust `kotlinCompilerExtensionVersion`, as necessary. + You should only need to do this if you + receive errors during `flutter run` and those errors tell you + which versions are installed on your machine. + + [developer.android.com]: {{site.android-dev}}/jetpack/androidx/releases/compose-kotlin + + 2. Next, add the following block at the bottom of the file, at the root level: + + ```groovy title="android/app/build.gradle" + dependencies { + implementation("androidx.core:core-ktx:1.10.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") + implementation("androidx.activity:activity-compose") + implementation(platform("androidx.compose:compose-bom:2024.06.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material:material") + implementation("androidx.compose.material3:material3") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + androidTestImplementation(platform("androidx.compose:compose-bom:2023.08.00")) + androidTestImplementation("androidx.compose.ui:ui-test-junit4") + debugImplementation("androidx.compose.ui:ui-tooling") + debugImplementation("androidx.compose.ui:ui-test-manifest") + } + ``` + + The second file requiring modifications is `android/build.gradle`. + + 1. Add the following buildscript block at the top of the file: + + ```groovy title="android/build.gradle" + buildscript { + dependencies { + // Replace with the latest version. + classpath 'com.android.tools.build:gradle:8.1.1' + } + repositories { + google() + mavenCentral() + } + } + ``` + + The third file requiring modifications is + `android/app/src/main/AndroidManifest.xml`. + + 1. In the root application block, add the following `` declaration: + + ```xml title="android/app/src/main/AndroidManifest.xml" + + + + // START COPYING HERE + + // END COPYING HERE + + + … + + ``` + + The fourth and final code requiring modifications is + `android/app/src/main/kotlin/com/example/flutter_android_activity/MainActivity.kt`. + Here you'll write Kotlin code for your desired Android functionality. + + 1. Add the necessary imports at the top of the file: + + :::note + Your imports might vary if library versions have changed or + if you introduce different Compose classes when + you write your own Kotlin code. + Follow your IDE's hints for the correct imports you require. + ::: + + ```kotlin title="MainActivity.kt" + package com.example.flutter_android_activity + + import android.content.Intent + import android.os.Bundle + import androidx.activity.ComponentActivity + import androidx.activity.compose.setContent + import androidx.compose.foundation.layout.Column + import androidx.compose.foundation.layout.fillMaxSize + import androidx.compose.material3.Button + import androidx.compose.material3.MaterialTheme + import androidx.compose.material3.Surface + import androidx.compose.material3.Text + import androidx.compose.ui.Modifier + import androidx.core.app.ActivityCompat + import io.flutter.embedding.android.FlutterActivity + import io.flutter.embedding.engine.FlutterEngine + import io.flutter.plugin.common.MethodCall + import io.flutter.plugin.common.MethodChannel + import io.flutter.plugins.GeneratedPluginRegistrant + ``` + + 1. Modify the generated `MainActivity` class by adding a + `CHANNEL` field and a `configureFlutterEngine` method: + + ```kotlin title="MainActivity.kt" + class MainActivity: FlutterActivity() { + // This value must match the `MethodChannel` name in your Dart code. + private val CHANNEL = "com.example.flutter_android_activity" + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + GeneratedPluginRegistrant.registerWith(flutterEngine) + + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { + call: MethodCall, result: MethodChannel.Result -> + when (call.method) { + // Note: This must match the first parameter passed to + // `platformMethodChannel.invokeMethod` in your Dart code. + "launchActivity" -> { + try { + // Takes an object, in this case a String. + val message = call.arguments + val intent = Intent(this@MainActivity, SecondActivity::class.java) + intent.putExtra("message", message.toString()) + startActivity(intent) + } catch (e: Exception){} + result.success(true) + } + else -> {} + } + } + } + } + ``` + + 1. Add a second `Activity` to the bottom of the file, which you + referenced in the previous changes to `AndroidManifest.xml`: + + ```kotlin title="MainActivity.kt" + class SecondActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContent { + Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { + Column { + Text(text = "Second Activity") + // Note: This must match the shape of the data passed from your Dart code. + Text("" + getIntent()?.getExtras()?.getString("message")) + Button(onClick = { finish() }) { + Text("Exit") + } + } + } + } + } + } + ``` + +These steps show how to launch a native Android activity from a Flutter app, +which can sometimes be an easy way to connect to specific Android functionality. diff --git a/src/content/platform-integration/android/install-android/install-android-from-linux.md b/src/content/platform-integration/android/install-android/install-android-from-linux.md index 1a99282d30..65f72e6a29 100644 --- a/src/content/platform-integration/android/install-android/install-android-from-linux.md +++ b/src/content/platform-integration/android/install-android/install-android-from-linux.md @@ -11,14 +11,10 @@ To add Android as a Flutter app target for Linux, follow this procedure. 1. Allocate a minimum of 7.5 GB of storage for Android Studio. Consider allocating 10 GB of storage for an optimal configuration. -1. Install the following prequisite packages for Android Studio: - `libc6:i386`, `libncurses5:i386`, `libstdc++6:i386`, `lib32z1`, `libbz2-1.0:i386` +1. Install the following prerequisite packages for Android Studio: ```console - $ sudo apt-get install \ - libc6:i386 libncurses5:i386 \ - libstdc++6:i386 lib32z1 \ - libbz2-1.0:i386 + $ sudo apt-get install libc6:amd64 libstdc++6:amd64 lib32z1 libbz2-1.0:amd64 ``` 1. Install [Android Studio][] {{site.appmin.android_studio}} or later diff --git a/src/content/platform-integration/android/install-android/install-android-from-web-on-chromeos.md b/src/content/platform-integration/android/install-android/install-android-from-web-on-chromeos.md index 4ab8a5100d..b282e9a288 100644 --- a/src/content/platform-integration/android/install-android/install-android-from-web-on-chromeos.md +++ b/src/content/platform-integration/android/install-android/install-android-from-web-on-chromeos.md @@ -11,14 +11,10 @@ To add Android as a Flutter app target for ChromeOS, follow this procedure. 1. Allocate a minimum of 7.5 GB of storage for Android Studio. Consider allocating 10 GB of storage for an optimal configuration. -1. Install the following prequisite packages for Android Studio: - `libc6:i386`, `libncurses5:i386`, `libstdc++6:i386`, `lib32z1`, `libbz2-1.0:i386` +1. Install the following prerequisite packages for Android Studio: ```console - $ sudo apt-get install \ - libc6:i386 libncurses5:i386 \ - libstdc++6:i386 lib32z1 \ - libbz2-1.0:i386 + $ sudo apt-get install libc6:amd64 libstdc++6:amd64 lib32z1 libbz2-1.0:amd64 ``` 1. Install [Android Studio][] {{site.appmin.android_studio}} or later diff --git a/src/content/platform-integration/android/install-android/install-android-from-web-on-linux.md b/src/content/platform-integration/android/install-android/install-android-from-web-on-linux.md index 8b32549307..178fbdaac1 100644 --- a/src/content/platform-integration/android/install-android/install-android-from-web-on-linux.md +++ b/src/content/platform-integration/android/install-android/install-android-from-web-on-linux.md @@ -11,14 +11,10 @@ To add Android as a Flutter app target for Linux, follow this procedure. 1. Allocate a minimum of 7.5 GB of storage for Android Studio. Consider allocating 10 GB of storage for an optimal configuration. -1. Install the following prequisite packages for Android Studio: - `libc6:i386`, `libncurses5:i386`, `libstdc++6:i386`, `lib32z1`, `libbz2-1.0:i386` +1. Install the following prerequisite packages for Android Studio: ```console - $ sudo apt-get install \ - libc6:i386 libncurses5:i386 \ - libstdc++6:i386 lib32z1 \ - libbz2-1.0:i386 + $ sudo apt-get install libc6:amd64 libstdc++6:amd64 lib32z1 libbz2-1.0:amd64 ``` 1. Install [Android Studio][] {{site.appmin.android_studio}} or later diff --git a/src/content/platform-integration/android/platform-views.md b/src/content/platform-integration/android/platform-views.md index 900d16d801..97477e5f9d 100644 --- a/src/content/platform-integration/android/platform-views.md +++ b/src/content/platform-integration/android/platform-views.md @@ -59,7 +59,7 @@ SurfaceFlinger composes the Flutter content and the platform views. * `-` FPS of application will be lower. * `-` Certain transformations that can be applied to Flutter widgets will not work when applied to platform views. -## [Texture Layer](#texturelayerhybridcompisition) (or Texture Layer Hybrid Composition) +## [Texture Layer](#texturelayerhybridcomposition) (or Texture Layer Hybrid Composition) Platform Views are rendered into a texture. Flutter draws the platform views (via the texture). @@ -162,7 +162,7 @@ For more information, see the API docs for: [`PlatformViewLink`]: {{site.api}}/flutter/widgets/PlatformViewLink-class.html [`PlatformViewsService`]: {{site.api}}/flutter/services/PlatformViewsService-class.html -### TextureLayerHybridCompisition +### TextureLayerHybridComposition In your Dart file, for example `native_view_example.dart`, diff --git a/src/content/platform-integration/ios/ios-latest.md b/src/content/platform-integration/ios/ios-latest.md index d522fcbfff..557531f082 100644 --- a/src/content/platform-integration/ios/ios-latest.md +++ b/src/content/platform-integration/ios/ios-latest.md @@ -1,5 +1,5 @@ --- -title: Flutter on iOS +title: Flutter on latest iOS description: >- Learn about Flutter's support for and compatibility with the latest releases of iOS. diff --git a/src/content/platform-integration/web/faq.md b/src/content/platform-integration/web/faq.md index c50d739f0c..2d8489a812 100644 --- a/src/content/platform-integration/web/faq.md +++ b/src/content/platform-integration/web/faq.md @@ -75,9 +75,7 @@ Flutter 的 Web 端支持会优先考虑和确保性能、保真度和一致性 进行分离,避免将它们混在一起。 That said, as mentioned in the [roadmap][], the Flutter team plans to -investigate search engine indexability of Flutter web. To that end, we built a -small website containing [Hawaii-themed space stories][space_hawaii], hoping -that search engines find and index this site. +investigate search engine indexability of Flutter web. ### How do I create an app that also runs on the web? @@ -307,7 +305,6 @@ Not currently. [roadmap]: {{site.github}}/flutter/flutter/blob/master/docs/roadmap/Roadmap.md#web-platform [run your web apps in any supported browser]: /platform-integration/web/building#create-and-run [Running Flutter inspector]: /tools/devtools/inspector -[space_hawaii]: https://alien-hawaii-2024.web.app/ [Web content in Flutter]: /platform-integration/web/web-content-in-flutter [Web support for Flutter]: /platform-integration/web [web workers]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers diff --git a/src/content/platform-integration/web/wasm.md b/src/content/platform-integration/web/wasm.md index c3a91a5277..d5f1754acc 100644 --- a/src/content/platform-integration/web/wasm.md +++ b/src/content/platform-integration/web/wasm.md @@ -150,7 +150,7 @@ As of {{last-update}}, You can verify whether the app is actually running with Wasm in two ways: ```dart -// Using the environment variable set by compliation (preferred) +// Using the environment variable set by compilation (preferred) const isRunningWithWasm = bool.fromEnvironment('dart.tool.dart2wasm'); // Using differences in number representation to test whether native (Wasm) diff --git a/src/content/reference/index.md b/src/content/reference/index.md new file mode 100644 index 0000000000..5e9dda41c1 --- /dev/null +++ b/src/content/reference/index.md @@ -0,0 +1,9 @@ +--- +layout: toc +# title: Flutter reference docs +title: Flutter 参考资料 +# short-title: Reference +short-title: 参考资料 +# description: Miscellaneous reference docs relating to Flutter. +description: 与 Flutter 相关的各种参考资料。 +--- diff --git a/src/content/reference/supported-platforms.md b/src/content/reference/supported-platforms.md index da0a939228..f931993dc0 100644 --- a/src/content/reference/supported-platforms.md +++ b/src/content/reference/supported-platforms.md @@ -5,25 +5,25 @@ description: The platforms that Flutter supports by platform version. --- As of Flutter {{site.appnow.flutter}}, -Flutter supports deploying apps the following combinations of +Flutter supports deploying apps on the following combinations of hardware architectures and operating system versions. These combinations are called _platforms_. -Flutter supports platforms in three tiers: +Flutter categorizes platforms as follows: -* **Supported**: The Flutter team tests these platforms on every commit. -* **Best effort**: The Flutter team intends to support these platforms - through coding practices. The team tests these platforms on an ad-hoc basis. +* **Supported**: The platforms and versions that the Flutter team supports. +* **CI-tested**: The Flutter team tests these platforms on every commit. * **Unsupported**: The Flutter team doesn't test or support these platforms. -Based on these tiers, Flutter supports deploying to the following platforms. +Based on these categories, +Flutter supports deploying to the following platforms. {% assign opsys = platforms %} -| Target Platform | Hardware architectures | Supported versions | Best effort versions | Unsupported versions | +| Target platform | Target architectures | Supported versions | CI-tested versions | Unsupported versions | |---|:---:|:---:|:---:|:---:| {%- for platform in opsys %} - | {{platform.platform}} | {{platform.chipsets}} | {{platform.supported}} | {{platform.besteffort}} | {{platform.unsupported}} | + | {{platform.platform}} | {{platform.target-arch}} | {{platform.supported}} | {{platform.ci-tested}} | {{platform.unsupported}} | {%- endfor %} {:.table .table-striped} diff --git a/src/content/release/breaking-changes/3-19-deprecations.md b/src/content/release/breaking-changes/3-19-deprecations.md index 4b5e863a53..f0cfa3e3a4 100644 --- a/src/content/release/breaking-changes/3-19-deprecations.md +++ b/src/content/release/breaking-changes/3-19-deprecations.md @@ -716,7 +716,7 @@ Relevant PRs: Supported by Flutter Fix: no As of Flutter 3.0 platform views require api 23 or higher. In Flutter 3.19 we now throw UnsupportedOperationException -when using platform views on android devices runing api level 22 and below. +when using platform views on android devices running api level 22 and below. **Migration guide** diff --git a/src/content/release/breaking-changes/android-surface-plugins.md b/src/content/release/breaking-changes/android-surface-plugins.md index c14d757034..f624a686d5 100644 --- a/src/content/release/breaking-changes/android-surface-plugins.md +++ b/src/content/release/breaking-changes/android-surface-plugins.md @@ -163,7 +163,7 @@ Relevant PRs: [`CameraCharacteristics.SENSOR_ORIENTATION`]: {{site.android-dev}}/reference/android/hardware/camera2/CameraCharacteristics#SENSOR_ORIENTATION [`RotatedBox`]: {{site.api}}/flutter/widgets/RotatedBox-class.html [Android orientation calculation documentation]: {{site.android-dev}}/media/camera/camera2/camera-preview#orientation_calculation -[this `camera_android_camerax` PR]: {{site.repo.flutter}}/packages/pull/7044 +[this `camera_android_camerax` PR]: {{site.repo.packages}}/pull/7044 [Issue 139702]: {{site.repo.flutter}}/issues/139702 [Issue 145930]: {{site.repo.flutter}}/issues/145930 [PR 51061]: {{site.repo.engine}}/pull/51061 diff --git a/src/content/release/breaking-changes/deprecate-themedata-dialogbackgroundcolor.md b/src/content/release/breaking-changes/deprecate-themedata-dialogbackgroundcolor.md new file mode 100644 index 0000000000..17b27d6d25 --- /dev/null +++ b/src/content/release/breaking-changes/deprecate-themedata-dialogbackgroundcolor.md @@ -0,0 +1,79 @@ +--- +title: Deprecate `ThemeData.dialogBackgroundColor` in favor of + `DialogThemeData.backgroundColor` +description: >- + The `ThemeData.dialogBackgroundColor` parameter has been replaced by + `DialogThemeData.backgroundColor`. +--- + +## Summary + +The [`ThemeData.dialogBackgroundColor`][] parameter was deprecated in favor of +the [`DialogThemeData.backgroundColor`][] parameter. + +## Context + +The defaults for the [`Dialog`][] and [`AlertDialog`][] widgets can be +overridden with a component-specific theme like [`DialogThemeData`][]. +Previously, the `ThemeData.dialogBackgroundColor` parameter was used to +override the default dialog background color, which was made redundant by +[`DialogThemeData`][]. + +## Description of change + +The [`ThemeData.dialogBackgroundColor`][] is deprecated in favor of +a component-specific theme. Use [`DialogThemeData`][] to override the default +background color. + +## Migration guide + +Replace [`ThemeData.dialogBackgroundColor`][] with +[`DialogThemeData.backgroundColor`][] to override the default dialog background +color. + +Code before migration: + +```dart +theme: ThemeData( + dialogBackgroundColor: Colors.orange, +), +``` + +Code after migration: + +```dart +theme: ThemeData( + dialogTheme: const DialogThemeData(backgroundColor: Colors.orange), +), +``` + +## Timeline + +Landed in version: v3.27.0-0.1.pre
+In stable release: TBD + +## References + +API documentation: + +- [`ThemeData.dialogBackgroundColor`][] +- [`DialogThemeData.backgroundColor`][] +- [`DialogThemeData`][] +- [`Dialog`][] +- [`AlertDialog`][] + +Relevant issues: + +- [Issue #91772][] + +Relevant PRs: + +- [Deprecate `ThemeData.dialogBackgroundColor` in favor of `DialogTheme.backgroundColor`][] + +[`ThemeData.dialogBackgroundColor`]: {{site.api}}/flutter/material/ThemeData/dialogBackgroundColor.html +[`DialogThemeData.backgroundColor`]: {{site.api}}/flutter/material/DialogThemeData/backgroundColor.html +[`DialogThemeData`]: {{site.api}}/flutter/material/DialogThemeData-class.html +[`Dialog`]: {{site.api}}/flutter/material/Dialog-class.html +[`AlertDialog`]: {{site.api}}/flutter/material/AlertDialog-class.html +[Issue #91772]: {{site.repo.flutter}}/issues/91772 +[Deprecate `ThemeData.dialogBackgroundColor` in favor of `DialogTheme.backgroundColor`]: {{site.repo.flutter}}/pull/155072 diff --git a/src/content/release/breaking-changes/flutter-generate-i10n-source.md b/src/content/release/breaking-changes/flutter-generate-i10n-source.md new file mode 100644 index 0000000000..be2fe4947e --- /dev/null +++ b/src/content/release/breaking-changes/flutter-generate-i10n-source.md @@ -0,0 +1,90 @@ +--- +title: Localized messages are generated into source, not a synthetic package. +description: >- + When using `package:flutter_localizations`, the default generated location + (and eventually, only possible location) is within your source (`lib/`) + directory, and not the synthetic package `package:flutter_gen`. +--- + +## Summary + +The `flutter` tool will no longer generate a synthetic `package:flutter_gen` +or modify the `package_config.json` of the application. Applications or tools +that previously referenced `package:flutter_gen` will instead reference source +files generated into the application directly. + +## Background + +`flutter_gen` is a virtual (synthetic) package that is created by the `flutter` +command-line tool to allow developers to import that package to access generated +symbols and functionality, such as for +[internationalization][Internationalizing Flutter apps]. As the package is not +listed in an app's `pubspec.yaml`, and is created via re-writing the (generated) +`package_config.json`, numerous problems have been created. + +## Migration Guide + +This change only effects users that have the following in their `pubspec.yaml`: + +```yaml +flutter: + generate: true +``` + +A synthetic package (`package:flutter_gen`) is created and referenced by the +application: + +```dart +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +// ... +const MaterialApp( + title: 'Localizations Sample App', + localizationsDelegates: AppLocalizations.localizationsDelegates, + supportedLocales: AppLocalizations.supportedLocales, +); +``` + +There are two ways to migrate away from importing `package:flutter_gen`: + +1. Specify `synthetic-package: false` in the accompanying [l10n.yaml][] file: + + ```yaml + synthetic-package: false + + # The files are generated into the path specified by `arb-dir` + arb-dir: lib/i18n + + # Or, specifically provide an output path: + output-dir: lib/src/generated/i18n + ``` + +2. Pass `--no-implicit-pubspec-resolution` to invocations of the `flutter` tool: + + ```sh + flutter run --no-implicit-pubspec-resolution + ``` + +## Timeline + +Not released + +Not released + 1, `package:flutter_gen` support will be removed. + +## References + +Relevant Issues: + +- [Issue 73870][], where `package:flutter_gen` pub problems are first found. +- [Issue 102983][], where `package:flutter_gen` problems are outlined. +- [Issue 157819][], where `--implicit-pubspec-resolution` is discussed. + +Relevant Articles: + +- [Internationalizing Flutter apps][], the canonical documentation for the + feature. + +[l10n.yaml]: https://docs.flutter.dev/ui/accessibility-and-internationalization/internationalization#configuring-the-l10n-yaml-file +[Issue 73870]: https://github.com/flutter/flutter/issues/73870 +[Issue 102983]: https://github.com/flutter/flutter/issues/102983 +[Issue 157819]: https://github.com/flutter/flutter/issues/157819 +[Internationalizing Flutter apps]: https://docs.flutter.dev/ui/accessibility-and-internationalization/internationalization#adding-your-own-localized-messages diff --git a/src/content/release/breaking-changes/flutter-gradle-plugin-apply.md b/src/content/release/breaking-changes/flutter-gradle-plugin-apply.md index e504355f17..ead798a74c 100644 --- a/src/content/release/breaking-changes/flutter-gradle-plugin-apply.md +++ b/src/content/release/breaking-changes/flutter-gradle-plugin-apply.md @@ -32,9 +32,12 @@ buildscripts. ### android/settings.gradle -First, find the values of the Android Gradle Plugin (AGP) and Kotlin that the project currently -uses. Unless they have been moved, they are likely defined in the buildscript block of the -`/android/build.gradle` file. As an example, consider the `build.gradle` file from +First, find the values of the Android Gradle Plugin (AGP) +and Kotlin that the project currently uses. +Unless they have been moved, +they are likely defined in the buildscript block of the +`/android/build.gradle` file. +As an example, consider the `build.gradle` file from a new Flutter app created before this change: ```groovy @@ -76,7 +79,8 @@ The AGP version is the number that comes at the end of the line in this case. Similarly, the Kotlin version comes at the end of the line `ext.kotlin_version = '1.7.10'`, in this case `1.7.10`. -Next, replace the contents of `/android/settings.gradle` with the below, +Next, replace the contents of +`/android/settings.gradle` with the following, remembering to replace `{agpVersion}` and `{kotlinVersion}` with previously identified values: @@ -109,8 +113,8 @@ include ":app" ``` If you made some changes to this file, make sure they're placed after -`pluginManagement {}` and `plugins {}` blocks, since Gradle enforces that no -other code may be placed before these blocks. +`pluginManagement {}` and `plugins {}` blocks, since Gradle enforces +that no other code can be placed before these blocks. ### android/build.gradle @@ -155,8 +159,10 @@ tasks.register("clean", Delete) { ### android/app/build.gradle -Most changes have to be made in the `/android/app/build.gradle`. First, -remove these 2 chunks of code that use the legacy imperative apply method: +The following changes to code that is, by default +found in `/android/app/build.gradle`, also need to be made. +First, remove the following 2 chunks of code that use the +legacy imperative apply method: ```groovy diff - def flutterRoot = localProperties.getProperty('flutter.sdk') @@ -171,8 +177,9 @@ remove these 2 chunks of code that use the legacy imperative apply method: - apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" ``` -Now apply the plugins again, but this time using the Plugin DSL syntax. At the -very top of your file, add: +Now apply the plugins again, +but this time using the Plugin DSL syntax. +At the very top of your file, add: ```groovy plugins { @@ -182,27 +189,29 @@ plugins { } ``` -Finally, if your `dependencies` block contains a dependency on `"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"`, +Finally, if your `dependencies` block contains a dependency +on `"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"`, then remove that dependency. + ```groovy diff dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } ``` -If it was the only dependency in the `dependencies` block, then -alternatively you may remove the block entirely. +If it was the only dependency in the `dependencies` block, +then you can instead remove the block entirely. ### Validation -Execute `flutter run` to confirm your app builds and launches on a connected -Android device or emulator. +Execute `flutter run` to confirm that your app builds and +launches on a connected Android device or emulator. ## Examples ### Google Mobile Services and Crashlytics -If your app was using Google Mobile Services and Crashlytics, remove the -following lines from `/android/build.gradle`: +If your app was using Google Mobile Services and Crashlytics, +remove the following lines from `/android/build.gradle`: ```groovy diff buildscript { @@ -216,7 +225,7 @@ following lines from `/android/build.gradle`: } ``` -and remove these 2 lines from `/android/app/build.gradle`: +Then remove these 2 lines from `/android/app/build.gradle`: ```groovy diff - apply plugin: 'com.google.gms.google-services' @@ -240,7 +249,7 @@ the ones you removed from the `/android/build.gradle` file. } ``` -and the following lines to `/android/app/build.gradle`: +Add the following lines to `/android/app/build.gradle`: ```groovy diff plugins { @@ -259,11 +268,13 @@ Recommended in stable release: 3.19.0 ## References -Gradle build files generated by `flutter create` differ across Flutter versions. -For a detailed overview, see [issue #135392][]. You should consider using the +Gradle build files generated by `flutter create` +differ across Flutter versions. +For a detailed overview, see [issue #135392][]. +You should consider using the latest versions of build files. [legacy, imperative apply script method]: https://docs.gradle.org/8.5/userguide/plugins.html#sec:script_plugins [declarative plugins {} block]: https://docs.gradle.org/8.5/userguide/plugins.html#sec:plugins_block [plugins block]: https://docs.gradle.org/current/userguide/plugins.html#plugins_dsl_limitations -[issue #135392]: https://github.com/flutter/flutter/issues/135392 +[issue #135392]: {{site.github}}/flutter/flutter/issues/135392 diff --git a/src/content/release/breaking-changes/flutter-plugins-configuration.md b/src/content/release/breaking-changes/flutter-plugins-configuration.md new file mode 100644 index 0000000000..cda0b05bd8 --- /dev/null +++ b/src/content/release/breaking-changes/flutter-plugins-configuration.md @@ -0,0 +1,151 @@ +--- +title: .flutter-plugins-dependencies replaces .flutter-plugins. +description: >- + The deprecated `.flutter-plugins` tool file output has been replaced by + `.flutter-plugins-dependencies`, and any build scripts or references to it + must also be updated. +--- + +## Summary + +The `flutter` tool will no longer output the legacy `.flutter-plugins` metadata +file, and only output `.flutter-plugins-dependencies`. Tools and build scripts, +such as Gradle configurations (for Android apps) that rely on the presence of +`.flutter-plugins` will need to be updated. + +## Background + +[In 2019][PR 45379] `.flutter-plugins-dependencies` was added as a newer file +format that replaces `.flutter-plugins`. + +So a file that looked something like this: + +```txt +# This is .flutter-plugins +camera=/path/to/camera/plugin +shared_preferences=shared_preferences +``` + +... was replaced by something like this: + +```json +{ + "dependencyGraph": { + "camera": { + "name": "camera", + "version": "0.10.0", + "dependencies": { + "flutter": "0.0.0" + } + }, + "shared_preferences": { + "name": "shared_preferences", + "version": "2.0.15", + "dependencies": { + "flutter": "0.0.0" + } + } + }, + "flutter": { + "frameworkRevision": "3a0f99d4f2", + "channel": "stable" + } +} +``` + +Having both files output is a source of technical debt that complicates new +feature sets like not bundling `dev_dependency` plugins in a release app. + +## Migration guide + +Most Flutter developers don't parse or use this file, but build configurations +(such as `settings.gradle`), as generated by older invocations of +`flutter create --platforms android`. These legacy files might still reference `.flutter-plugins` and +must be updated to a newer build script. + +For example: + +```groovy +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +// Note explicitly reading the legacy '.flutter-plugins' file. +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} +``` + +... might be upgraded to its `settings.gradle.kts` equivalent: + +```kts +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + // Note the use of the flutter-plugin-loader versus reading '.flutter-plugins' + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.1.0" apply false + id("org.jetbrains.kotlin.android") version "1.8.22" apply false +} + +include(":app") +``` + +See [Deprecated imperative apply of Flutter's Gradle plugins][imperative-apply] +for details of switching to the newer plugin DSL. + +To smoke test whether your build relies on a `.flutter-plugins` file, you +can use the flag `--no-implicit-pubspec-resolution`: + +```sh +flutter build apk --no-implicit-pubspec-resolution +``` + +Any build tools or scripts that might rely on that file being output will now +fail. + +## Timeline + +Not released + +Not released + 1, `.flutter-plugins` support will be removed. + +## References + +Relevant Issues: + +- [Issue 48918][], where `.flutter-plugins` was (in 2020) slated for deprecation. + +Relevant PRs: + +- [PR 45379][], where `.flutter-plugins-dependencies` was originally added. +- [PR 157388][], where a warning was adding to the Flutter Android build scripts. + +[Issue 48918]: https://github.com/flutter/flutter/issues/48918 +[PR 45379]: https://github.com/flutter/flutter/pull/45379 +[PR 157388]: https://github.com/flutter/flutter/pull/157388 +[imperative-apply]: https://docs.flutter.dev/release/breaking-changes/flutter-gradle-plugin-apply diff --git a/src/content/release/breaking-changes/image-filter-blur-tilemode.md b/src/content/release/breaking-changes/image-filter-blur-tilemode.md new file mode 100644 index 0000000000..d90bb936b1 --- /dev/null +++ b/src/content/release/breaking-changes/image-filter-blur-tilemode.md @@ -0,0 +1,82 @@ +--- +title: ImageFilter.blur default tile mode automatic selection. +description: >- + If a tile mode wasn't specified in the constructor, ImageFilter.blur will + select one based on the rendering context. +--- + +## Summary + + The `ui.ImageFilter.blur`'s default tile mode is now automatically selected + by the backend. Previously `TileMode.clamp` was used unless a different tile + mode was specified. Now, the default is `null` and specifies automatic + selection unless a specific tile mode is specified. + +## Background + + `ImageFilter.blur`'s _tile mode_ specifies what happens to edge pixels for + the applied filter. There are four options, `TileMode.clamp` (the previous + default), `Tilemode.repeated`, `TileMode.mirror`, and `TileMode.decal`. + Previously, `ImageFilter` defaulted to `clamp` mode if the + behavior wasn't specified, which sometimes surprised developers + as it didn't always match expectations. + + As of this change, the filter automatically selects the following tile modes + based on context: + + * `decal` with save layers and when applied to individual shape draws + (drawRect, drawPath, ...) + * `mirror` with backdrop filters. + * `clamp` for drawImage. + +## Migration guide + + Only blur image filters that don't specify an explicit tile mode are + impacted by this change. We believe that the new defaults are generally + better and would recommend removing any specified blur tile modes. + + +Code before migration: + +```dart +var filter = ui.ImageFilter.blur(sigmaX: 4, sigmaY: 4, tileMode: TileMode.decal); +``` + +Code after migration: + +```dart +var filter = ui.ImageFilter.blur(sigmaX: 4, sigmaY: 4); +``` + +## Timeline + +Landed in version: 3.27.0-1.0.pre.30 +In stable release: Not yet + +## References + +{% include docs/main-api.md %} + +API documentation: + +* [`ImageFilter`][] +* [`TileMode`][] + +Relevant issues: + +* [Issue #154935][] +* [Issue #110318][] +* [Issue #157693][] + +Relevant PRs: + +* [Change default TileMode for blur ImageFilter objects to null][] + + +[`ImageFilter`]: https://api.flutter.dev/flutter/dart-ui/ImageFilter-class.html +[`ImageFilter.blur`]: https://api.flutter.dev/flutter/dart-ui/ImageFilter/ImageFilter.blur.html +[`TileMode`]: https://api.flutter.dev/flutter/dart-ui/TileMode.html +[Issue #154935]: https://github.com/flutter/flutter/issues/154935 +[Issue #110318]: https://github.com/flutter/flutter/issues/110318 +[Issue #157693]: https://github.com/flutter/flutter/issues/157693 +[Change default TileMode for blur ImageFilter objects to null]: https://github.com/flutter/engine/pull/55552 diff --git a/src/content/release/breaking-changes/index.md b/src/content/release/breaking-changes/index.md index fe24b2b049..c1088ba8a0 100644 --- a/src/content/release/breaking-changes/index.md +++ b/src/content/release/breaking-changes/index.md @@ -55,17 +55,25 @@ release, and listed in alphabetical order: ### Not yet released to stable +* [`ImageFilter.blur` default tile mode automatic selection][] +* [Localized messages are generated into source, not a synthetic package][] +* [`.flutter-plugins-dependencies` replaces `.flutter-plugins`][] * [`Color` wide gamut support][] * [Remove invalid parameters for `InputDecoration.collapsed`][] * [Stop generating `AssetManifest.json`][] * [Deprecate `TextField.canRequestFocus`][] * [Set default for SystemUiMode to Edge-to-Edge][] +* [Deprecate `ThemeData.dialogBackgroundColor` in favor of `DialogThemeData.backgroundColor`][] +[`ImageFilter.blur` default tile mode automatic selection]: /release/breaking-changes/image-filter-blur-tilemode +[Localized messages are generated into source, not a synthetic package]: /release/breaking-changes/flutter-generate-i10n-source +[`.flutter-plugins-dependencies` replaces `.flutter-plugins`]: /release/breaking-changes/flutter-plugins-configuration [`Color` wide gamut support]: /release/breaking-changes/wide-gamut-framework [Remove invalid parameters for `InputDecoration.collapsed`]: /release/breaking-changes/input-decoration-collapsed [Stop generating `AssetManifest.json`]: /release/breaking-changes/asset-manifest-dot-json [Deprecate `TextField.canRequestFocus`]: /release/breaking-changes/can-request-focus [Set default for SystemUiMode to Edge-to-Edge]: /release/breaking-changes/default-systemuimode-edge-to-edge +[Deprecate `ThemeData.dialogBackgroundColor` in favor of `DialogThemeData.backgroundColor`]: /release/breaking-changes/deprecate-themedata-dialogbackgroundcolor
### Released in Flutter 3.24 diff --git a/src/content/release/breaking-changes/new-color-scheme-roles.md b/src/content/release/breaking-changes/new-color-scheme-roles.md index 649b9c18a6..7354f0ceb0 100644 --- a/src/content/release/breaking-changes/new-color-scheme-roles.md +++ b/src/content/release/breaking-changes/new-color-scheme-roles.md @@ -154,7 +154,7 @@ Relevant PRs: * [Enhance ColorScheme.fromSeed with a new variant parameter][] [Support tone-based surface and surface container ColorScheme roles]: {{site.repo.flutter}}/issues/115912 -[Support fidelity variant for ColorScheme.fromSeed]: {{site.repo.flutter}}/issues/[144649] -[Introduce tone-based surfaces and accent color add-ons - Part 1]: {{site.repo.flutter}}/pull/[142654] -[Introduce tone-based surfaces and accent color add-ons - Part 2]: {{site.repo.flutter}}/pull/[144273] -[Enhance ColorScheme.fromSeed with a new variant parameter]: {{site.repo.flutter}}/pull/[144805] +[Support fidelity variant for ColorScheme.fromSeed]: {{site.repo.flutter}}/issues/144649 +[Introduce tone-based surfaces and accent color add-ons - Part 1]: {{site.repo.flutter}}/pull/142654 +[Introduce tone-based surfaces and accent color add-ons - Part 2]: {{site.repo.flutter}}/pull/144273 +[Enhance ColorScheme.fromSeed with a new variant parameter]: {{site.repo.flutter}}/pull/144805 diff --git a/src/content/release/upgrade.md b/src/content/release/upgrade.md index f8a478845c..2e96c15002 100644 --- a/src/content/release/upgrade.md +++ b/src/content/release/upgrade.md @@ -146,7 +146,7 @@ the **beta** and **stable** channels. We do not recommend using this channel as it is more likely to contain serious regressions. -我们不推荐使用这个渠道,因为它更有可能包含严重的回归问题。 +我们不推荐使用这个渠道,因为它更有可能包含严重的退化问题。 The latest documentation for the **main** branch is at: diff --git a/src/content/resources/architectural-overview.md b/src/content/resources/architectural-overview.md index 54f24a4aa3..bb0935a996 100644 --- a/src/content/resources/architectural-overview.md +++ b/src/content/resources/architectural-overview.md @@ -1795,12 +1795,6 @@ provides a useful guide to the framework's design philosophy. [Flutter 工作原理](/resources/inside-flutter) 白皮书为框架的设计理念提供了很好的入门途径。 ---- - -**Footnotes:** - -**脚注:** - [^1]: While the `build` function returns a fresh tree, you only need to return something _different_ if there's some new configuration to incorporate. diff --git a/src/content/resources/courses.md b/src/content/resources/courses.md index 58407b178a..94beb0d2d8 100644 --- a/src/content/resources/courses.md +++ b/src/content/resources/courses.md @@ -9,12 +9,12 @@ up-to-date information, such as null-safe Dart code. These courses are listed alphabetically. To include your course, [submit a PR][]: +* [The Best Flutter Course on the Internet][] by Tadas Petra & Robert Brunhage +* [Flutter in Production][] by Andrea Bizzotto * [Flutter Foundations][] by Andrea Bizzotto * [Flutter & Firebase Masterclass][] by Andrea Bizzotto * [Flutter Animations Masterclass][] by Andrea Bizzotto * [The Complete Dart Developer Guide][] by Andrea Bizzotto -* [Flutter Fundamentals][] by Tadas Petra -* [The Ultimate Login System][] by Tadas Petra * [Flutter & Dart - The Complete Guide, 2023 Edition][] * [The Complete 2021 Flutter Development Bootcamp Using Dart][] by App Brewery * [Flutter Crash Course][] by Nick Manning @@ -27,12 +27,12 @@ To include your course, [submit a PR][]: * [Sticky Grouped Headers in Flutter][] by Marco Napoli * [Flutter University - From Zero to Mastery][] by Fudeo (Italian) +[The Best Flutter Course on the Internet]: https://www.hungrimind.com/learn/flutter +[Flutter in Production]: https://codewithandrea.com/courses/flutter-in-production/ [Flutter Foundations]: https://codewithandrea.com/courses/flutter-foundations/ [Flutter & Firebase Masterclass]: https://codewithandrea.com/courses/flutter-firebase-masterclass/ [Flutter Animations Masterclass]: https://codewithandrea.com/courses/flutter-animations-masterclass/ [The Complete Dart Developer Guide]: https://codewithandrea.com/courses/complete-dart-guide/ -[Flutter Fundamentals]: https://www.hungrimind.com/courses/flutter/fundamentals -[The Ultimate Login System]: https://www.hungrimind.com/courses/flutter/login-riverpod-firebase [Flutter & Dart - The Complete Guide, 2023 Edition]: https://www.udemy.com/course/learn-flutter-dart-to-build-ios-android-apps/ [The Complete 2021 Flutter Development Bootcamp Using Dart]: https://www.appbrewery.co/p/flutter-development-bootcamp-with-dart/ [Flutter Crash Course]: https://fluttercrashcourse.com/ diff --git a/src/content/resources/support.md b/src/content/resources/support.md index b63bb0484f..e738673a18 100644 --- a/src/content/resources/support.md +++ b/src/content/resources/support.md @@ -22,6 +22,7 @@ Note that filing bugs is _not_ an efficient way to get tech support. ## I want to ask questions about how to use Flutter Your best bet is to consult +[Flutter Forum](https://forum.itsallwidgets.com/), [Stack Overflow](https://stackoverflow.com/questions/tagged/flutter), or [Discord](https://discord.com/invite/rflutterdev). While the community is active in these channels, diff --git a/src/content/tools/devtools/inspector.md b/src/content/tools/devtools/inspector.md index 950635b6b9..09c177af3d 100644 --- a/src/content/tools/devtools/inspector.md +++ b/src/content/tools/devtools/inspector.md @@ -7,7 +7,7 @@ tags: Flutter开发工具,DevTools keywords: Flutter inspector,widget 树 --- - + :::note diff --git a/src/content/tools/devtools/release-notes/images-2.40.1/deep_link_ios.png b/src/content/tools/devtools/release-notes/images-2.40.1/deep_link_ios.png new file mode 100644 index 0000000000..4ca808b4c8 Binary files /dev/null and b/src/content/tools/devtools/release-notes/images-2.40.1/deep_link_ios.png differ diff --git a/src/content/tools/devtools/release-notes/images-2.40.1/new_inspector.png b/src/content/tools/devtools/release-notes/images-2.40.1/new_inspector.png new file mode 100644 index 0000000000..f5d75ab13f Binary files /dev/null and b/src/content/tools/devtools/release-notes/images-2.40.1/new_inspector.png differ diff --git a/src/content/tools/devtools/release-notes/images-2.40.1/wasm_setting.png b/src/content/tools/devtools/release-notes/images-2.40.1/wasm_setting.png new file mode 100644 index 0000000000..73bbc65978 Binary files /dev/null and b/src/content/tools/devtools/release-notes/images-2.40.1/wasm_setting.png differ diff --git a/src/content/tools/devtools/release-notes/release-notes-2.40.1-src.md b/src/content/tools/devtools/release-notes/release-notes-2.40.1-src.md new file mode 100644 index 0000000000..c25b313dcb --- /dev/null +++ b/src/content/tools/devtools/release-notes/release-notes-2.40.1-src.md @@ -0,0 +1,65 @@ +# DevTools 2.40.1 release notes + +The 2.40.1 release of the Dart and Flutter DevTools +includes the following changes among other general improvements. +To learn more about DevTools, check out the +[DevTools overview](/tools/devtools/overview). + +## General updates + +* Add a setting that allows users to opt in to loading DevTools + with WebAssembly. - [#8270](https://github.com/flutter/devtools/pull/8270) + + ![Wasm opt-in setting](/tools/devtools/release-notes/images-2.40.1/wasm_setting.png "DevTools setting to opt into wasm.") + +* Removed the legacy Provider screen from DevTools. + The `package:provider` tool is now distributed as a + DevTools extension from `package:provider`. + Upgrade your `package:provider` dependency to + use the extension. - [#8364](https://github.com/flutter/devtools/pull/8364) + +* Fixed a bug that was causing the DevTools release notes to + always show. - [#8277](https://github.com/flutter/devtools/pull/8277) + +* Added support for loading extensions in pub workspaces + [8347](https://github.com/flutter/devtools/pull/8347). + +* Mapped error stack traces to use the Dart source code locations so + that they are human-readable. - [#8385](https://github.com/flutter/devtools/pull/8385) + +* Added handling for IDE theme change events to + update embedded DevTools UI. - [#8336](https://github.com/flutter/devtools/pull/8336) + +* Fixed a bug that was causing data filters to be cleared when clearing data +on the Network and Logging screens. - [#8407](https://github.com/flutter/devtools/pull/8407) + +* Fixed a bug that was causing the navigator to lose state when opening the VM +Flags dialog. - [#8413](https://github.com/flutter/devtools/pull/8413) + +## Inspector updates + +- Added a setting to the Flutter Inspector controls that + allows users to opt in to the newly redesigned Flutter Inspector. - [#8342](https://github.com/flutter/devtools/pull/8342) + + ![New inspector opt-in setting](/tools/devtools/release-notes/images-2.40.1/new_inspector.png "DevTools setting to opt into the new Flutter Inspector.") + +## Performance updates + +* Fixed an issue with the "Refreshing timeline" overlay that was getting shown + when it should not have been. - [#8318](https://github.com/flutter/devtools/pull/8318) + +## Network profiler updates + +* Resolved an issue in `.har` export where + response content was sometimes missing in the data. - [#8333](https://github.com/flutter/devtools/pull/8333) + +## Deep links tool updates + +- Added support for validating iOS deep link settings. - [#8394](https://github.com/flutter/devtools/pull/8394) + + ![Deep link validator for iOS](/tools/devtools/release-notes/images-2.40.1/deep_link_ios.png "DevTools Deep link validator Page") + +## Full commit history + +To find a complete list of changes in this release, check out the +[DevTools git log](https://github.com/flutter/devtools/tree/v2.40.1). diff --git a/src/content/tools/devtools/release-notes/release-notes-2.40.1.md b/src/content/tools/devtools/release-notes/release-notes-2.40.1.md new file mode 100644 index 0000000000..6c3b6dffc5 --- /dev/null +++ b/src/content/tools/devtools/release-notes/release-notes-2.40.1.md @@ -0,0 +1,7 @@ +--- +short-title: 2.40.1 release notes +description: Release notes for Dart and Flutter DevTools version 2.40.1. +toc: false +--- + +{% include ./release-notes-2.40.1-src.md %} diff --git a/src/content/tools/vs-code.md b/src/content/tools/vs-code.md index 7a97e87d71..1cdca8dd05 100644 --- a/src/content/tools/vs-code.md +++ b/src/content/tools/vs-code.md @@ -570,6 +570,25 @@ Flutter 扩展包括以下片段: 前缀 `stanim`:创建一个 `StatefulWidget` 子类,并且把包含字段初始化的 State 子类和一个 `AnimationController` 关联。 +The Dart extension includes the following snippets: + +| Prefix | Description | Code Example | +|---|---|---| +| `main` | Insert a main function, used as an entry point. | `void main(List args) { }` | +| `try` | Insert a try/catch block. | `try { } catch (e) { }` | +| `if` | Insert an if statement. | `if (condition) { }` | +| `ife` | Insert an if statement with an else block. | `if (condition) { } else { }` | +| `switch` | Insert a switch statement. | `switch (variable) { case value1: break; case value2: break; default: }` | +| `for` | Insert a for loop. | `for (var i = 0; i < 10; i++) { }` | +| `fori` | Insert a for-in loop. | `for (var item in list) { }` | +| `while` | Insert a while loop. | `while (condition) { }` | +| `do` | Insert a do-while loop. | `do { } while (condition);` | +| `fun` | Insert a function definition. | `void myFunction(String name) { }` | +| `class` | Insert a class definition. | `class MyClass { }` | +| `typedef` | Insert a typedef. | `typedef MyFunction = void Function(String);` | +| `test` | Insert a test block. | `test('My test description', () { });` | +| `group` | Insert a test group block. | `group('My test group', () { });` | + You can also define custom snippets by executing **Configure User Snippets** from the [Command Palette][]. diff --git a/src/content/ui/accessibility-and-internationalization/accessibility.md b/src/content/ui/accessibility-and-internationalization/accessibility.md index b5db2c8913..74f7de21b2 100644 --- a/src/content/ui/accessibility-and-internationalization/accessibility.md +++ b/src/content/ui/accessibility-and-internationalization/accessibility.md @@ -434,48 +434,65 @@ These cover recommendations for text contrast, target size, and target labels. 该 API 可以检查应用程序的用户界面是否符合 Flutter 的无障碍建议。 这些建议包括文字对比度、目标尺寸和目标标签。 -The following example shows how to use the Guideline API on Name Generator. -You created this app as part of the -[Write your first Flutter app](/get-started/codelab) codelab. -Each button on the app's main screen serves as a tappable target -with text represented in 18 point. - -下面的示例展示了如何在名称生成器中使用 Guideline API。 -这个应用程序是 [构建你的第一个 Flutter 应用](/get-started/codelab) codelab 中的内容。 -应用程序主屏幕上的每个按钮(文字为 18 像素)都是一个可点击的目标。 +The following snippet shows how to use the Guideline API on +a sample widget named `AccessibleApp`: - - -```dart -final SemanticsHandle handle = tester.ensureSemantics(); -await tester.pumpWidget(MyApp()); +以下代码片段展示了如果在名为 `AccessibleApp` 的 widget 上 +使用 Guideline API: -// Checks that tappable nodes have a minimum size of 48 by 48 pixels -// for Android. -await expectLater(tester, meetsGuideline(androidTapTargetGuideline)); +The following snippet shows how to use the Guideline API on +a sample widget named `AccessibleApp`: -// Checks that tappable nodes have a minimum size of 44 by 44 pixels -// for iOS. -await expectLater(tester, meetsGuideline(iOSTapTargetGuideline)); +以下代码片段展示了如何在名为 `AccessibleApp` 的 widget 上 +使用 Guideline API: -// Checks that touch targets with a tap or long press action are labeled. -await expectLater(tester, meetsGuideline(labeledTapTargetGuideline)); + +```dart title="test/a11y_test.dart" +import 'package:flutter_test/flutter_test.dart'; +import 'package:your_accessible_app/main.dart'; -// Checks whether semantic nodes meet the minimum text contrast levels. -// The recommended text contrast is 3:1 for larger text -// (18 point and above regular). -await expectLater(tester, meetsGuideline(textContrastGuideline)); -handle.dispose(); +void main() { + testWidgets('Follows a11y guidelines', (tester) async { + final SemanticsHandle handle = tester.ensureSemantics(); + await tester.pumpWidget(const AccessibleApp()); + + // Checks that tappable nodes have a minimum size of 48 by 48 pixels + // for Android. + await expectLater(tester, meetsGuideline(androidTapTargetGuideline)); + + // Checks that tappable nodes have a minimum size of 44 by 44 pixels + // for iOS. + await expectLater(tester, meetsGuideline(iOSTapTargetGuideline)); + + // Checks that touch targets with a tap or long press action are labeled. + await expectLater(tester, meetsGuideline(labeledTapTargetGuideline)); + + // Checks whether semantic nodes meet the minimum text contrast levels. + // The recommended text contrast is 3:1 for larger text + // (18 point and above regular). + await expectLater(tester, meetsGuideline(textContrastGuideline)); + handle.dispose(); + }); +} ``` -You can add Guideline API tests -in `test/widget_test.dart` of your app directory, or as a separate test -file (such as `test/a11y_test.dart` in the case of the Name Generator). +To try these tests out, run them on the app you create in the +[Write your first Flutter app](/get-started/codelab) codelab. +Each button on that app's main screen serves as a tappable target +with text rendered in an 18 point font. + +如果要尝试这些测试,请在 +[编写你的第一个 Flutter 应用](/get-started/codelab) codelab 中运行他们。 +该应用程序主屏幕上的每个按钮(文字为 18 像素)都是一个可点击的目标。 + +You can add Guideline API tests alongside other [widget tests][], +or in a separate file, such as `test/a11y_test.dart` in this example. 你可以在应用程序目录的 `test/widget_test.dart` 中添加 Guideline API 测试, 也可以将其作为单独的测试文件(如名称生成器中的 `test/a11y_test.dart`)。 [Accessibility Guideline API]: {{site.api}}/flutter/flutter_test/AccessibilityGuideline-class.html +[widget tests]: /testing/overview#widget-tests ## Testing accessibility on web diff --git a/src/content/ui/accessibility-and-internationalization/internationalization.md b/src/content/ui/accessibility-and-internationalization/internationalization.md index a31267c53d..dccc79035b 100644 --- a/src/content/ui/accessibility-and-internationalization/internationalization.md +++ b/src/content/ui/accessibility-and-internationalization/internationalization.md @@ -947,7 +947,7 @@ use the following instructions: 在项目编辑器中选择 `Info` 选项卡。 5. In the **Localizations** section, click the `Add` button - (`+`) to add the supported lanaguages and regions to your + (`+`) to add the supported languages and regions to your project. When asked to choose files and reference language, simply select `Finish`. diff --git a/src/content/ui/adaptive-responsive/general.md b/src/content/ui/adaptive-responsive/general.md index 2225129c91..0fdc9a3fb1 100644 --- a/src/content/ui/adaptive-responsive/general.md +++ b/src/content/ui/adaptive-responsive/general.md @@ -24,7 +24,7 @@ First, identify the widgets that you plan to make dynamic. Analyze the constructors for those widgets and abstract out the data that you can share. -Common widgets that require adaptibility are: +Common widgets that require adaptability are: * Dialogs, both fullscreen and modal * Navigation UI, both rail and bottom bar diff --git a/src/content/ui/assets/assets-and-images.md b/src/content/ui/assets/assets-and-images.md index 47a82b1363..ef3c841d81 100644 --- a/src/content/ui/assets/assets-and-images.md +++ b/src/content/ui/assets/assets-and-images.md @@ -71,22 +71,34 @@ To add files located in subdirectories, create an entry per directory. ::: :::note + Indentation matters in YAML. If you see an error like `Error: unable to find directory entry in pubspec.yaml` then you _might_ have indented incorrectly in your pubspec file. Consider the following [broken] example: + +YAML 中的缩进很重要。如果你看到类似 +`Error: unable to find directory entry in pubspec.yaml` +这样的错误,那么你 _可能_ 在 pubspec 文件中存在缩进错误。 +请看下面这个 [错误] 的例子: + ```yaml flutter: assets: - directory/ ``` + The `assets:` line should be indented by exactly two spaces below the `flutter:` line: + +`assets:` 这一行应该在 `flutter:` 下方缩进两个空格: + ```yaml flutter: assets: - directory/ ``` + ::: ### Asset bundling diff --git a/src/content/ui/navigation/url-strategies.md b/src/content/ui/navigation/url-strategies.md index bc937bbece..2edbc8c97a 100644 --- a/src/content/ui/navigation/url-strategies.md +++ b/src/content/ui/navigation/url-strategies.md @@ -32,13 +32,33 @@ For example, `flutterexample.dev/#/path/to/screen`. ## 配置 URL 策略 To configure Flutter to use the path instead, use the -[usePathUrlStrategy][] function provided by the [flutter_web_plugins][] library -in the SDK: +[usePathUrlStrategy][] function provided by the [flutter_web_plugins][] library, +which is part of the Flutter SDK. + +要配置 Flutter 使用 path 策略, +请使用 Flutter SDK 中 [flutter_web_plugins][] 库 +提供的 [usePathUrlStrategy][] 方法。 + +You can't directly add `flutter_web_plugins` using `pub add`. +Include it as a Flutter [SDK dependency][] in your `pubspec.yaml` file: + +你不能直接使用 `pub add` 添加 `flutter_web_plugins`。 +请将其作为 Flutter [SDK 依赖项][SDK dependency] +包含在你的 `pubspec.yaml` 文件中: + +```yaml highlightLines=4-5 +dependencies: + flutter: + sdk: flutter + flutter_web_plugins: + sdk: flutter +``` + +Then call the `usePathUrlStrategy` function before `runApp`: -让 Flutter 使用 path 策略,请使用 [flutter_web_plugins][] -库中提供的 [`setUrlStrategy`][] 方法。 +然后在 `runApp` 前调用 `usePathUrlStrategy` 函数: -```dart +```dart highlightLines=4 import 'package:flutter_web_plugins/url_strategy.dart'; void main() { @@ -47,6 +67,8 @@ void main() { } ``` +[SDK dependency]: {{site.dart-site}}/tools/pub/dependencies#sdk + ## Configuring your web server ## 配置 web 服务器 @@ -89,7 +111,7 @@ For example, to host your Flutter app at this tag to ``. 更新 `web/index.html` 中的 `` 标签为你的应用部署路径。 -例如:如果你期望将 Flutter 应用部署在 `myapp.dev/flutter_app`, +例如:如果你期望将 Flutter 应用部署在 `my_app.dev/flutter_app`, 则更改此标签为 ``。 Relative `base href` tags are supported for release builds but they must take diff --git a/tool/flutter_site/lib/src/commands/analyze_dart.dart b/tool/flutter_site/lib/src/commands/analyze_dart.dart index 22d5f4450b..4329cd3368 100644 --- a/tool/flutter_site/lib/src/commands/analyze_dart.dart +++ b/tool/flutter_site/lib/src/commands/analyze_dart.dart @@ -40,11 +40,13 @@ int analyzeDart({ ...exampleProjectDirectories, ]; - print('Analyzing code...'); + if (!verboseLogging) { + print('Analyzing code...'); + } for (final directory in directoriesToAnalyze) { if (verboseLogging) { - print('Analyzing code in $directory...'); + print("Analyzing code in '$directory' directory..."); } final flutterAnalyzeOutput = Process.runSync( @@ -59,11 +61,11 @@ int analyzeDart({ stderr.write(normalOutput); stderr.write(errorOutput); - stderr.writeln('Error: Analysis on $directory failed.'); + stderr.writeln("Error: Analysis on '$directory' directory failed."); return 1; } else { if (verboseLogging) { - print('Successfully analyzed code in $directory!'); + print("Successfully analyzed code in '$directory' directory!"); } } } diff --git a/tool/flutter_site/lib/src/commands/format_dart.dart b/tool/flutter_site/lib/src/commands/format_dart.dart index 91f6bd8fd2..6fd978e277 100644 --- a/tool/flutter_site/lib/src/commands/format_dart.dart +++ b/tool/flutter_site/lib/src/commands/format_dart.dart @@ -42,9 +42,7 @@ int formatDart({bool justCheck = false}) { .listSync() .whereType() .map((e) => e.path) - .where((e) => - path.basename(e) != 'codelabs' && - !path.basename(e).startsWith('.')), + .where((e) => !path.basename(e).startsWith('.')), ]; final dartFormatOutput = Process.runSync(Platform.resolvedExecutable, [ diff --git a/tool/flutter_site/lib/src/utils.dart b/tool/flutter_site/lib/src/utils.dart index be940971ed..ddb1dd66aa 100644 --- a/tool/flutter_site/lib/src/utils.dart +++ b/tool/flutter_site/lib/src/utils.dart @@ -51,10 +51,9 @@ extension ArgResultExtensions on ArgResults? { /// A collection of the paths of all Dart projects with /// a pubspec.yaml file in the `/examples` directory, -/// excluding ones in hidden directories or codelabs. +/// excluding ones in hidden directories. final List exampleProjectDirectories = findNestedDirectoriesWithPubspec( Directory('examples'), - skipPaths: {path.join('examples', 'codelabs')}, skipHidden: true, )..sort(); diff --git a/tool/flutter_site/pubspec.yaml b/tool/flutter_site/pubspec.yaml index d97932629d..be85d9e1d3 100644 --- a/tool/flutter_site/pubspec.yaml +++ b/tool/flutter_site/pubspec.yaml @@ -8,11 +8,11 @@ environment: dependencies: args: ^2.4.2 excerpter: - path: ../../site-shared/packages/excerpter + path: ../../site-shared/pkgs/excerpter io: ^1.0.4 linkcheck: ^3.0.0 path: ^1.9.0 dev_dependencies: analysis_defaults: - path: ../../site-shared/packages/analysis_defaults + path: ../../site-shared/pkgs/analysis_defaults diff --git a/tool/inject_dartpad/analysis_options.yaml b/tool/inject_dartpad/analysis_options.yaml deleted file mode 100644 index b9bdf805ac..0000000000 --- a/tool/inject_dartpad/analysis_options.yaml +++ /dev/null @@ -1 +0,0 @@ -include: package:analysis_defaults/analysis.yaml diff --git a/tool/inject_dartpad/lib/inject_dartpad.js b/tool/inject_dartpad/lib/inject_dartpad.js new file mode 100644 index 0000000000..6780dda3c0 --- /dev/null +++ b/tool/inject_dartpad/lib/inject_dartpad.js @@ -0,0 +1,2765 @@ +(function dartProgram(){function copyProperties(a,b){var t=Object.keys(a) +for(var s=0;s=0)return true +if(typeof version=="function"&&version.length==0){var r=version() +if(/^\d+\.\d+\.\d+\.\d+$/.test(r))return true}}catch(q){}return false}() +function inherit(a,b){a.prototype.constructor=a +a.prototype["$i"+a.name]=a +if(b!=null){if(z){Object.setPrototypeOf(a.prototype,b.prototype) +return}var t=Object.create(b.prototype) +copyProperties(a.prototype,t) +a.prototype=t}}function inheritMany(a,b){for(var t=0;t0;b=t){t=b-1 +s=a.charCodeAt(t) +if(s!==32&&s!==13&&!J.Ga(s))break}return b}, +U6(a){if(typeof a=="string")return J.Dr.prototype +if(a==null)return a +if(Array.isArray(a))return J.jd.prototype +if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype +if(typeof a=="symbol")return J.Dw.prototype +if(typeof a=="bigint")return J.rQ.prototype +return a}if(a instanceof A.a)return a +return J.M3(a)}, +c(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.bU.prototype +return J.kD.prototype}if(typeof a=="string")return J.Dr.prototype +if(a==null)return J.CD.prototype +if(typeof a=="boolean")return J.yE.prototype +if(Array.isArray(a))return J.jd.prototype +if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype +if(typeof a=="symbol")return J.Dw.prototype +if(typeof a=="bigint")return J.rQ.prototype +return a}if(a instanceof A.a)return a +return J.M3(a)}, +w1(a){if(a==null)return a +if(Array.isArray(a))return J.jd.prototype +if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype +if(typeof a=="symbol")return J.Dw.prototype +if(typeof a=="bigint")return J.rQ.prototype +return a}if(a instanceof A.a)return a +return J.M3(a)}, +CR(a){return J.c(a).gbx(a)}, +GA(a,b){return J.w1(a).F(a,b)}, +Hm(a){return J.U6(a).gB(a)}, +M1(a,b,c){return J.w1(a).E2(a,b,c)}, +Nu(a){return J.c(a).gi(a)}, +cf(a,b){if(a==null)return b==null +if(typeof a!="object")return b!=null&&a===b +return J.c(a).DN(a,b)}, +p(a){return J.w1(a).gkz(a)}, +t(a){return J.c(a)["["](a)}, +vB:function vB(){}, +yE:function yE(){}, +CD:function CD(){}, +MF:function MF(){}, +zh:function zh(){}, +iC:function iC(){}, +kd:function kd(){}, +c5:function c5(){}, +rQ:function rQ(){}, +Dw:function Dw(){}, +jd:function jd(a){this.$ti=a}, +Po:function Po(a){this.$ti=a}, +D:function D(a,b,c){var _=this +_.a=a +_.b=b +_.c=0 +_.d=null +_.$ti=c}, +qI:function qI(){}, +bU:function bU(){}, +kD:function kD(){}, +Dr:function Dr(){}},A={FK:function FK(){}, +oo(a){var t,s=a^48 +if(s<=9)return s +t=a|32 +if(97<=t&&t<=102)return t-87 +return-1}, +yc(a,b){a=a+b&536870911 +a=a+((a&524287)<<10)&536870911 +return a^a>>>6}, +qL(a){a=a+((a&67108863)<<3)&536870911 +a^=a>>>11 +return a+((a&16383)<<15)&536870911}, +ks(a){var t,s +for(t=$.Qu.length,s=0;s").Kq(d).C("xy<1,2>")) +return new A.i1(a,b,c.C("@<0>").Kq(d).C("i1<1,2>"))}, +Wp(){return new A.lj("No element")}, +n:function n(a){this.a=a}, +zl:function zl(){}, +bQ:function bQ(){}, +aL:function aL(){}, +a7:function a7(a,b,c){var _=this +_.a=a +_.b=b +_.c=0 +_.d=null +_.$ti=c}, +i1:function i1(a,b,c){this.a=a +this.b=b +this.$ti=c}, +xy:function xy(a,b,c){this.a=a +this.b=b +this.$ti=c}, +MH:function MH(a,b,c){var _=this +_.a=null +_.b=a +_.c=b +_.$ti=c}, +A8:function A8(a,b,c){this.a=a +this.b=b +this.$ti=c}, +SU:function SU(){}, +NQ(a){var t=v.mangledGlobalNames[a] +if(t!=null)return t +return"minified:"+a}, +wV(a,b){var t +if(b!=null){t=b.x +if(t!=null)return t}return u.p.b(a)}, +I(a){var t +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" +t=J.t(a) +return t}, +eQ(a){var t,s=$.xu +if(s==null)s=$.xu=Symbol("identityHashCode") +t=a[s] +if(t==null){t=Math.random()*0x3fffffff|0 +a[s]=t}return t}, +Hp(a,b){var t,s,r,q,p,o=null,n=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a) +if(n==null)return o +t=n[3] +if(b==null){if(t!=null)return parseInt(a,10) +if(n[2]!=null)return parseInt(a,16) +return o}if(b<2||b>36)throw A.Og(A.TE(b,2,36,"radix",o)) +if(b===10&&t!=null)return parseInt(a,10) +if(b<10||t==null){s=b<=10?47+b:86+b +r=n[1] +for(q=r.length,p=0;ps)return o}return parseInt(a,b)}, +l(a){return A.H(a)}, +H(a){var t,s,r,q +if(a instanceof A.a)return A.m(A.z(a),null) +t=J.c(a) +if(t===B.Ok||t===B.Ub||u.o.b(a)){s=B.O4(a) +if(s!=="Object"&&s!=="")return s +r=a.constructor +if(typeof r=="function"){q=r.name +if(typeof q=="string"&&q!=="Object"&&q!=="")return q}}return A.m(A.z(a),null)}, +i(a){if(a==null||typeof a=="number"||A.y(a))return J.t(a) +if(typeof a=="string")return JSON.stringify(a) +if(a instanceof A.d)return a["["](0) +if(a instanceof A.M)return a.k(!0) +return"Instance of '"+A.l(a)+"'"}, +fw(a,b,c){var t,s,r,q +if(c<=500&&b===0&&c===a.length)return String.fromCharCode.apply(null,a) +for(t=b,s="";t>>0,t&1023|56320)}}throw A.Og(A.TE(a,0,1114111,null,null))}, +HY(a,b){var t,s="index" +if(!A.ok(b))return new A.AT(!0,b,s,null) +t=J.Hm(a) +if(b<0||b>=t)return A.xF(b,t,a,s) +return new A.bJ(null,null,!0,b,s,"Value not in range")}, +au(a,b,c){if(a>c)return A.TE(a,0,c,"start",null) +if(b!=null)if(bc)return A.TE(b,a,c,"end",null) +return new A.AT(!0,b,"end",null)}, +tL(a){return new A.AT(!0,a,null,null)}, +Og(a){return A.r(new Error(),a)}, +r(a,b){var t +if(b==null)b=new A.E() +a.dartException=b +t=A.J +if("defineProperty" in Object){Object.defineProperty(a,"message",{get:t}) +a.name=""}else a.toString=t +return a}, +J(){return J.t(this.dartException)}, +v(a){throw A.Og(a)}, +A(a,b){throw A.r(b,a)}, +G(a){throw A.Og(A.a4(a))}, +CU(a){if(a==null)return J.Nu(a) +if(typeof a=="object")return A.eQ(a) +return J.Nu(a)}, +dJ(a,b){var t,s,r,q=a.length +for(t=0;t=0}, +S0:function S0(a,b){this.a=a +this.b=b}, +d:function d(){}, +E1:function E1(){}, +lc:function lc(){}, +zx:function zx(){}, +rT:function rT(a,b){this.a=a +this.b=b}, +GK:function GK(a){this.a=a}, +Eq:function Eq(a){this.a=a}, +N5:function N5(a){var _=this +_.a=0 +_.f=_.e=_.d=_.c=_.b=null +_.r=0 +_.$ti=a}, +vh:function vh(a,b){var _=this +_.a=a +_.b=b +_.d=_.c=null}, +i5:function i5(a,b){this.a=a +this.$ti=b}, +N6:function N6(a,b){var _=this +_.a=a +_.b=b +_.d=_.c=null}, +dC:function dC(a){this.a=a}, +wN:function wN(a){this.a=a}, +VX:function VX(a){this.a=a}, +M:function M(){}, +B7:function B7(){}, +VR:function VR(a,b){var _=this +_.a=a +_.b=b +_.d=_.c=null}, +od(a,b,c){if(a>>>0!==a||a>=c)throw A.Og(A.HY(b,a))}, +rM(a,b,c){var t +if(!(a>>>0!==a))t=b>>>0!==b||a>b||b>c +else t=!0 +if(t)throw A.Og(A.au(a,b,c)) +return b}, +WZ:function WZ(){}, +eH:function eH(){}, +df:function df(){}, +b0:function b0(){}, +Dg:function Dg(){}, +DV:function DV(){}, +zU:function zU(){}, +K8:function K8(){}, +xj:function xj(){}, +dE:function dE(){}, +ZA:function ZA(){}, +wf:function wf(){}, +Pq:function Pq(){}, +eE:function eE(){}, +V6:function V6(){}, +RG:function RG(){}, +vX:function vX(){}, +WB:function WB(){}, +VS:function VS(){}, +cz(a,b){var t=b.c +return t==null?b.c=A.Bc(a,b.x,!0):t}, +xZ(a,b){var t=b.c +return t==null?b.c=A.Q2(a,"b8",[b.x]):t}, +Q1(a){var t=a.w +if(t===6||t===7||t===8)return A.Q1(a.x) +return t===12||t===13}, +mD(a){return a.as}, +q7(a){return A.Ew(v.typeUniverse,a,!1)}, +PL(a0,a1,a2,a3){var t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a=a1.w +switch(a){case 5:case 1:case 2:case 3:case 4:return a1 +case 6:t=a1.x +s=A.PL(a0,t,a2,a3) +if(s===t)return a1 +return A.SO(a0,s,!0) +case 7:t=a1.x +s=A.PL(a0,t,a2,a3) +if(s===t)return a1 +return A.Bc(a0,s,!0) +case 8:t=a1.x +s=A.PL(a0,t,a2,a3) +if(s===t)return a1 +return A.LN(a0,s,!0) +case 9:r=a1.y +q=A.bZ(a0,r,a2,a3) +if(q===r)return a1 +return A.Q2(a0,a1.x,q) +case 10:p=a1.x +o=A.PL(a0,p,a2,a3) +n=a1.y +m=A.bZ(a0,n,a2,a3) +if(o===p&&m===n)return a1 +return A.ap(a0,o,m) +case 11:l=a1.x +k=a1.y +j=A.bZ(a0,k,a2,a3) +if(j===k)return a1 +return A.oP(a0,l,j) +case 12:i=a1.x +h=A.PL(a0,i,a2,a3) +g=a1.y +f=A.qT(a0,g,a2,a3) +if(h===i&&f===g)return a1 +return A.Nf(a0,h,f) +case 13:e=a1.y +a3+=e.length +d=A.bZ(a0,e,a2,a3) +p=a1.x +o=A.PL(a0,p,a2,a3) +if(d===e&&o===p)return a1 +return A.DS(a0,o,d,!0) +case 14:c=a1.x +if(c") +for(s=1;s=0)q+=" "+s[r];++r}return q+"})"}, +L(a2,a3,a4){var t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0=", ",a1=null +if(a4!=null){t=a4.length +if(a3==null)a3=A.j([],u.s) +else a1=a3.length +s=a3.length +for(r=t;r>0;--r)a3.push("T"+(s+r)) +for(q=u.X,p=u._,o="<",n="",r=0;r0){b+=a+"[" +for(a="",r=0;r0){b+=a+"{" +for(a="",r=0;r "+c}, +m(a,b){var t,s,r,q,p,o,n=a.w +if(n===5)return"erased" +if(n===2)return"dynamic" +if(n===3)return"void" +if(n===1)return"Never" +if(n===4)return"any" +if(n===6)return A.m(a.x,b) +if(n===7){t=a.x +s=A.m(t,b) +r=t.w +return(r===12||r===13?"("+s+")":s)+"?"}if(n===8)return"FutureOr<"+A.m(a.x,b)+">" +if(n===9){q=A.o(a.x) +p=a.y +return p.length>0?q+("<"+A.b(p,b)+">"):q}if(n===11)return A.k(a,b) +if(n===12)return A.L(a,b,null) +if(n===13)return A.L(a.x,b,a.y) +if(n===14){o=a.x +return b[b.length-1-o]}return"?"}, +o(a){var t=v.mangledGlobalNames[a] +if(t!=null)return t +return"minified:"+a}, +Qo(a,b){var t=a.tR[b] +for(;typeof t=="string";)t=a.tR[t] +return t}, +ai(a,b){var t,s,r,q,p,o=a.eT,n=o[b] +if(n==null)return A.Ew(a,b,!1) +else if(typeof n=="number"){t=n +s=A.mZ(a,5,"#") +r=A.vU(t) +for(q=0;q0)q+="<"+A.Ux(c)+">" +t=a.eC.get(q) +if(t!=null)return t +s=new A.Jc(null,null) +s.w=9 +s.x=b +s.y=c +if(c.length>0)s.c=c[0] +s.as=q +r=A.BD(a,s) +a.eC.set(q,r) +return r}, +ap(a,b,c){var t,s,r,q,p,o +if(b.w===10){t=b.x +s=b.y.concat(c)}else{s=c +t=b}r=t.as+(";<"+A.Ux(s)+">") +q=a.eC.get(r) +if(q!=null)return q +p=new A.Jc(null,null) +p.w=10 +p.x=t +p.y=s +p.as=r +o=A.BD(a,p) +a.eC.set(r,o) +return o}, +oP(a,b,c){var t,s,r="+"+(b+"("+A.Ux(c)+")"),q=a.eC.get(r) +if(q!=null)return q +t=new A.Jc(null,null) +t.w=11 +t.x=b +t.y=c +t.as=r +s=A.BD(a,t) +a.eC.set(r,s) +return s}, +Nf(a,b,c){var t,s,r,q,p,o=b.as,n=c.a,m=n.length,l=c.b,k=l.length,j=c.c,i=j.length,h="("+A.Ux(n) +if(k>0){t=m>0?",":"" +h+=t+"["+A.Ux(l)+"]"}if(i>0){t=m>0?",":"" +h+=t+"{"+A.S4(j)+"}"}s=o+(h+")") +r=a.eC.get(s) +if(r!=null)return r +q=new A.Jc(null,null) +q.w=12 +q.x=b +q.y=c +q.as=s +p=A.BD(a,q) +a.eC.set(s,p) +return p}, +DS(a,b,c,d){var t,s=b.as+("<"+A.Ux(c)+">"),r=a.eC.get(s) +if(r!=null)return r +t=A.hw(a,b,c,s,d) +a.eC.set(s,t) +return t}, +hw(a,b,c,d,e){var t,s,r,q,p,o,n,m +if(e){t=c.length +s=A.vU(t) +for(r=0,q=0;q0){o=A.PL(a,b,s,0) +n=A.bZ(a,c,s,0) +return A.DS(a,o,n,c!==n)}}m=new A.Jc(null,null) +m.w=13 +m.x=b +m.y=c +m.as=d +return A.BD(a,m)}, +ow(a,b,c,d){return{u:a,e:b,r:c,s:[],p:0,n:d}}, +eT(a){var t,s,r,q,p,o,n,m=a.r,l=a.s +for(t=m.length,s=0;s=48&&r<=57)s=A.Al(s+1,r,m,l) +else if((((r|32)>>>0)-97&65535)<26||r===95||r===36||r===124)s=A.R8(a,s,m,l,!1) +else if(r===46)s=A.R8(a,s,m,l,!0) +else{++s +switch(r){case 44:break +case 58:l.push(!1) +break +case 33:l.push(!0) +break +case 59:l.push(A.KQ(a.u,a.e,l.pop())) +break +case 94:l.push(A.Hc(a.u,l.pop())) +break +case 35:l.push(A.mZ(a.u,5,"#")) +break +case 64:l.push(A.mZ(a.u,2,"@")) +break +case 126:l.push(A.mZ(a.u,3,"~")) +break +case 60:l.push(a.p) +a.p=l.length +break +case 62:A.rD(a,l) +break +case 38:A.I3(a,l) +break +case 42:q=a.u +l.push(A.SO(q,A.KQ(q,a.e,l.pop()),a.n)) +break +case 63:q=a.u +l.push(A.Bc(q,A.KQ(q,a.e,l.pop()),a.n)) +break +case 47:q=a.u +l.push(A.LN(q,A.KQ(q,a.e,l.pop()),a.n)) +break +case 40:l.push(-3) +l.push(a.p) +a.p=l.length +break +case 41:A.Mt(a,l) +break +case 91:l.push(a.p) +a.p=l.length +break +case 93:p=l.splice(a.p) +A.cH(a.u,a.e,p) +a.p=l.pop() +l.push(p) +l.push(-1) +break +case 123:l.push(a.p) +a.p=l.length +break +case 125:p=l.splice(a.p) +A.Be(a.u,a.e,p) +a.p=l.pop() +l.push(p) +l.push(-2) +break +case 43:o=m.indexOf("(",s) +l.push(m.substring(s,o)) +l.push(-4) +l.push(a.p) +a.p=l.length +s=o+1 +break +default:throw"Bad character "+r}}}n=l.pop() +return A.KQ(a.u,a.e,n)}, +Al(a,b,c,d){var t,s,r=b-48 +for(t=c.length;a=48&&s<=57))break +r=r*10+(s-48)}d.push(r) +return a}, +R8(a,b,c,d,e){var t,s,r,q,p,o,n=b+1 +for(t=c.length;n>>0)-97&65535)<26||s===95||s===36||s===124))r=s>=48&&s<=57 +else r=!0 +if(!r)break}}q=c.substring(b,n) +if(e){t=a.u +p=a.e +if(p.w===10)p=p.x +o=A.Qo(t,p.x)[q] +if(o==null)A.v('No "'+q+'" in "'+A.mD(p)+'"') +d.push(A.cE(t,p,o))}else d.push(q) +return n}, +rD(a,b){var t,s=a.u,r=A.oU(a,b),q=b.pop() +if(typeof q=="string")b.push(A.Q2(s,q,r)) +else{t=A.KQ(s,a.e,q) +switch(t.w){case 12:b.push(A.DS(s,t,r,a.n)) +break +default:b.push(A.ap(s,t,r)) +break}}}, +Mt(a,b){var t,s,r,q=a.u,p=b.pop(),o=null,n=null +if(typeof p=="number")switch(p){case-1:o=b.pop() +break +case-2:n=b.pop() +break +default:b.push(p) +break}else b.push(p) +t=A.oU(a,b) +p=b.pop() +switch(p){case-3:p=b.pop() +if(o==null)o=q.sEA +if(n==null)n=q.sEA +s=A.KQ(q,a.e,p) +r=new A.ET() +r.a=t +r.b=o +r.c=n +b.push(A.Nf(q,s,r)) +return +case-4:b.push(A.oP(q,b.pop(),t)) +return +default:throw A.Og(A.hV("Unexpected state under `()`: "+A.I(p)))}}, +I3(a,b){var t=b.pop() +if(0===t){b.push(A.mZ(a.u,1,"0&")) +return}if(1===t){b.push(A.mZ(a.u,4,"1&")) +return}throw A.Og(A.hV("Unexpected extended operation "+A.I(t)))}, +oU(a,b){var t=b.splice(a.p) +A.cH(a.u,a.e,t) +a.p=b.pop() +return t}, +KQ(a,b,c){if(typeof c=="string")return A.Q2(a,c,a.sEA) +else if(typeof c=="number"){b.toString +return A.TV(a,b,c)}else return c}, +cH(a,b,c){var t,s=c.length +for(t=0;to)return!1 +n=o-p +m=t.b +l=s.b +k=m.length +j=l.length +if(p+k=e)return!1 +a0=g[c] +c+=3 +if(a0?new Array(r):v.typeUniverse.sEA +for(p=0;p0?new Array(a):v.typeUniverse.sEA}, +Jc:function Jc(a,b){var _=this +_.a=a +_.b=b +_.r=_.f=_.d=_.c=null +_.w=0 +_.as=_.Q=_.z=_.y=_.x=null}, +ET:function ET(){this.c=this.b=this.a=null}, +lY:function lY(a){this.a=a}, +u9:function u9(){}, +iM:function iM(a){this.a=a}, +vL(a,b){var t=a[b] +return t===a?null:t}, +cW(a,b,c){if(c==null)a[b]=a +else a[b]=c}, +a0(){var t=Object.create(null) +A.cW(t,"",t) +delete t[""] +return t}, +EF(a,b,c){return A.dJ(a,new A.N5(b.C("@<0>").Kq(c).C("N5<1,2>")))}, +C(a,b){return new A.N5(a.C("@<0>").Kq(b).C("N5<1,2>"))}, +nO(a){var t,s={} +if(A.ks(a))return"{...}" +t=new A.Rn("") +try{$.Qu.push(a) +t.a+="{" +s.a=!0 +a.aN(0,new A.mN(s,t)) +t.a+="}"}finally{$.Qu.pop()}s=t.a +return s.charCodeAt(0)==0?s:s}, +k6:function k6(){}, +YF:function YF(a){var _=this +_.a=0 +_.e=_.d=_.c=_.b=null +_.$ti=a}, +Ni:function Ni(a,b){this.a=a +this.$ti=b}, +t3:function t3(a,b,c){var _=this +_.a=a +_.b=b +_.c=0 +_.d=null +_.$ti=c}, +F:function F(){}, +il:function il(){}, +mN:function mN(a,b){this.a=a +this.b=b}, +Uk:function Uk(){}, +wI:function wI(){}, +Zi:function Zi(){}, +u5:function u5(){}, +E3:function E3(){}, +Rw:function Rw(a){this.b=0 +this.c=a}, +QA(a,b){var t=A.Hp(a,b) +if(t!=null)return t +throw A.Og(A.rr(a,null,null))}, +O8(a,b,c){var t,s +if(a<0||a>4294967295)A.v(A.TE(a,0,4294967295,"length",null)) +t=J.x(A.j(new Array(a),c.C("jd<0>"))) +if(a!==0&&b!=null)for(s=0;s")) +for(t=J.p(a);t.G();)s.push(t.gl()) +if(b)return s +return J.x(s)}, +HM(a){var t +A.k1(0,"start") +t=A.Nz(a,0,null) +return t}, +Nz(a,b,c){var t=a.length +if(b>=t)return"" +return A.fw(a,b,t)}, +nu(a){return new A.VR(a,A.v4(a,!1,!0,!1,!1,!1))}, +vg(a,b,c){var t=J.p(b) +if(!t.G())return a +if(c.length===0){do a+=A.I(t.gl()) +while(t.G())}else{a+=A.I(t.gl()) +for(;t.G();)a=a+c+A.I(t.gl())}return a}, +eP(a,b,c,d){var t,s,r,q,p,o="0123456789ABCDEF" +if(c===B.xM){t=$.z4() +t=t.b.test(b)}else t=!1 +if(t)return b +s=B.Qk.W(b) +for(t=s.length,r=0,q="";r>>4]&1<<(p&15))!==0)q+=A.Lw(p) +else q=d&&p===32?q+"+":q+"%"+o[p>>>4&15]+o[p&15]}return q.charCodeAt(0)==0?q:q}, +tS(a){var t,s,r +if(!$.Ob())return A.yf(a) +t=new URLSearchParams() +a.aN(0,new A.bp(t)) +s=t.toString() +r=s.length +if(r>0&&s[r-1]==="=")s=B.xB.Nj(s,0,r-1) +return s.replace(/=&|\*|%7E/g,b=>b==="=&"?"&":b==="*"?"%2A":"~")}, +h(a){if(typeof a=="number"||A.y(a)||a==null)return J.t(a) +if(typeof a=="string")return JSON.stringify(a) +return A.i(a)}, +hV(a){return new A.C6(a)}, +q(a){return new A.AT(!1,null,null,a)}, +TE(a,b,c,d,e){return new A.bJ(b,c,!0,a,d,"Invalid value")}, +jB(a,b,c){if(0>a||a>c)throw A.Og(A.TE(a,0,c,"start",null)) +if(b!=null){if(a>b||b>c)throw A.Og(A.TE(b,a,c,"end",null)) +return b}return c}, +k1(a,b){if(a<0)throw A.Og(A.TE(a,0,null,b,null)) +return a}, +xF(a,b,c,d){return new A.eY(b,!0,a,d,"Index out of range")}, +u0(a){return new A.ub(a)}, +SY(a){return new A.ds(a)}, +a4(a){return new A.UV(a)}, +rr(a,b,c){return new A.aE(a,b,c)}, +Sd(a,b,c){var t,s +if(A.ks(a)){if(b==="("&&c===")")return"(...)" +return b+"..."+c}t=A.j([],u.s) +$.Qu.push(a) +try{A.Vr(a,t)}finally{$.Qu.pop()}s=A.vg(b,t,", ")+c +return s.charCodeAt(0)==0?s:s}, +tA(a,b,c){var t,s +if(A.ks(a))return b+"..."+c +t=new A.Rn(b) +$.Qu.push(a) +try{s=t +s.a=A.vg(s.a,a,", ")}finally{$.Qu.pop()}t.a+=c +s=t.a +return s.charCodeAt(0)==0?s:s}, +Vr(a,b){var t,s,r,q,p,o,n,m=a.gkz(a),l=0,k=0 +while(!0){if(!(l<80||k<3))break +if(!m.G())return +t=A.I(m.gl()) +b.push(t) +l+=t.length+2;++k}if(!m.G()){if(k<=5)return +s=b.pop() +r=b.pop()}else{q=m.gl();++k +if(!m.G()){if(k<=4){b.push(A.I(q)) +return}s=A.I(q) +r=b.pop() +l+=s.length+2}else{p=m.gl();++k +for(;m.G();q=p,p=o){o=m.gl();++k +if(k>100){while(!0){if(!(l>75&&k>3))break +l-=b.pop().length+2;--k}b.push("...") +return}}r=A.I(q) +s=A.I(p) +l+=s.length+r.length+4}}if(k>b.length+2){l+=5 +n="..."}else n=null +while(!0){if(!(l>80&&b.length>3))break +l-=b.pop().length+2 +if(n==null){l+=5 +n="..."}}if(n!=null)b.push(n) +b.push(r) +b.push(s)}, +f5(a,b,c,d){var t +if(B.zt===c){t=B.jn.gi(a) +b=J.Nu(b) +return A.qL(A.yc(A.yc($.t8(),t),b))}if(B.zt===d){t=B.jn.gi(a) +b=J.Nu(b) +c=J.Nu(c) +return A.qL(A.yc(A.yc(A.yc($.t8(),t),b),c))}t=B.jn.gi(a) +b=J.Nu(b) +c=J.Nu(c) +d=J.Nu(d) +d=A.qL(A.yc(A.yc(A.yc(A.yc($.t8(),t),b),c),d)) +return d}, +Hh(a,b,c){var t,s,r,q,p,o,n="IPv4 address should contain exactly 4 parts",m="each part must be in the range 0..255",l=new A.cS(a),k=new Uint8Array(4) +for(t=b,s=t,r=0;t9)l.$2("invalid character",t)}else{if(r===3)l.$2(n,t) +p=A.QA(B.xB.Nj(a,s,t),null) +if(p>255)l.$2(m,s) +o=r+1 +k[r]=p +s=t+1 +r=o}}if(r!==3)l.$2(n,c) +p=A.QA(B.xB.Nj(a,s,c),null) +if(p>255)l.$2(m,s) +k[r]=p +return k}, +eg(a,b,c){var t,s,r,q,p,o,n,m,l,k,j,i,h,g,f=null,e=new A.VC(a),d=new A.JT(e,a) +if(a.length<2)e.$2("address is too short",f) +t=A.j([],u.t) +for(s=b,r=s,q=!1,p=!1;s>>0) +t.push((l[2]<<8|l[3])>>>0)}if(q){if(t.length>7)e.$2("an address with a wildcard must have less than 7 parts",f)}else if(t.length!==8)e.$2("an address without a wildcard must contain exactly 8 parts",f) +k=new Uint8Array(16) +for(m=t.length,j=9-m,s=0,i=0;s=b&&r=b&&t>>4]&1<<(q&15))!==0){if(r&&65<=q&&90>=q){if(j==null)j=new A.Rn("") +if(s>>4]&1<<(p&15))!==0){if(q&&65<=p&&90>=p){if(r==null)r=new A.Rn("") +if(s>>4]&1<<(p&15))!==0)A.R3(a,t,"Invalid character") +else{k=1 +if((p&64512)===55296&&t+1>>4]&1<<(r&15))!==0))A.R3(a,t,"Illegal scheme character") +if(65<=r&&r<=90)s=!0}a=B.xB.Nj(a,b,c) +return A.Ya(s?a.toLowerCase():a)}, +Ya(a){if(a==="http")return"http" +if(a==="file")return"file" +if(a==="https")return"https" +if(a==="package")return"package" +return a}, +zR(a,b,c){return A.PI(a,b,c,B.TA,!1,!1)}, +ka(a,b,c,d,e,f){var t=e==="file",s=t||f,r=new A.A8(d,new A.RZ(),A.t6(d).C("A8<1,qU>")).H(0,"/") +if(r.length===0){if(t)return"/"}else if(s&&!B.xB.R(r,"/"))r="/"+r +return A.Jr(r,e,f)}, +Jr(a,b,c){var t=b.length===0 +if(t&&!c&&!B.xB.R(a,"/")&&!B.xB.R(a,"\\"))return A.wF(a,!t||c) +return A.xe(a)}, +le(a,b,c,d){return A.tS(d)}, +yf(a){var t={},s=new A.Rn("") +t.a="" +a.aN(0,new A.fq(new A.IP(t,s))) +t=s.a +return t.charCodeAt(0)==0?t:t}, +tG(a,b,c){return null}, +rv(a,b,c){var t,s,r,q,p,o=b+2 +if(o>=a.length)return"%" +t=a.charCodeAt(b+1) +s=a.charCodeAt(o) +r=A.oo(t) +q=A.oo(s) +if(r<0||q<0)return"%" +p=r*16+q +if(p<127&&(B.fY[B.jn.wG(p,4)]&1<<(p&15))!==0)return A.Lw(c&&65<=p&&90>=p?(p|32)>>>0:p) +if(t>=97||s>=97)return B.xB.Nj(a,b,b+3).toUpperCase() +return null}, +zX(a){var t,s,r,q,p,o="0123456789ABCDEF" +if(a<128){t=new Uint8Array(3) +t[0]=37 +t[1]=o.charCodeAt(a>>>4) +t[2]=o.charCodeAt(a&15)}else{if(a>2047)if(a>65535){s=240 +r=4}else{s=224 +r=3}else{s=192 +r=2}t=new Uint8Array(3*r) +for(q=0;--r,r>=0;s=128){p=B.jn.bf(a,6*r)&63|s +t[q]=37 +t[q+1]=o.charCodeAt(p>>>4) +t[q+2]=o.charCodeAt(p&15) +q+=3}}return A.HM(t)}, +PI(a,b,c,d,e,f){var t=A.Ul(a,b,c,d,e,f) +return t==null?B.xB.Nj(a,b,c):t}, +Ul(a,b,c,d,e,f){var t,s,r,q,p,o,n,m,l,k,j=null +for(t=!e,s=b,r=s,q=j;s>>4]&1<<(p&15))!==0)++s +else{o=1 +if(p===37){n=A.rv(a,s,!1) +if(n==null){s+=3 +continue}if("%"===n)n="%25" +else o=3}else if(p===92&&f)n="/" +else if(t&&p<=93&&(B.Eb[p>>>4]&1<<(p&15))!==0){A.R3(a,s,"Invalid character") +o=j +n=o}else{if((p&64512)===55296){m=s+1 +if(m=2&&A.Et(a.charCodeAt(0)))for(t=1;t127||(B.Ho[s>>>4]&1<<(s&15))===0)break}return a}, +Et(a){var t=a|32 +return 97<=t&&t<=122}, +bp:function bp(a){this.a=a}, +Ge:function Ge(){}, +C6:function C6(a){this.a=a}, +E:function E(){}, +AT:function AT(a,b,c,d){var _=this +_.a=a +_.b=b +_.c=c +_.d=d}, +bJ:function bJ(a,b,c,d,e,f){var _=this +_.e=a +_.f=b +_.a=c +_.b=d +_.c=e +_.d=f}, +eY:function eY(a,b,c,d,e){var _=this +_.f=a +_.a=b +_.b=c +_.c=d +_.d=e}, +ub:function ub(a){this.a=a}, +ds:function ds(a){this.a=a}, +lj:function lj(a){this.a=a}, +UV:function UV(a){this.a=a}, +k5:function k5(){}, +aE:function aE(a,b,c){this.a=a +this.b=b +this.c=c}, +cX:function cX(){}, +c8:function c8(){}, +a:function a(){}, +Rn:function Rn(a){this.a=a}, +cS:function cS(a){this.a=a}, +VC:function VC(a){this.a=a}, +JT:function JT(a,b){this.a=a +this.b=b}, +Dn:function Dn(a,b,c,d,e,f,g){var _=this +_.a=a +_.b=b +_.c=c +_.d=d +_.e=e +_.f=f +_.r=g +_.y=_.w=$}, +RZ:function RZ(){}, +IP:function IP(a,b){this.a=a +this.b=b}, +fq:function fq(a){this.a=a}, +K(a,b,c){if(c>=1)return a.$1(b) +return a.$0()}, +m6(a){return a==null||A.y(a)||typeof a=="number"||typeof a=="string"||u.U.b(a)||u.E.b(a)||u.e.b(a)||u.O.b(a)||u.D.b(a)||u.k.b(a)||u.v.b(a)||u.B.b(a)||u.q.b(a)||u.J.b(a)||u.Y.b(a)}, +Pe(a){if(A.m6(a))return a +return new A.Pb(new A.YF(u.G)).$1(a)}, +Pb:function Pb(a){this.a=a}, +lM:function lM(){this.a=$}, +YE:function YE(){}, +hy(a){if(a==null)return null +return new A.TZ(a)}, +TZ:function TZ(a){this.a=a}, +E2(){var t,s,r,q,p=self,o=p.document.querySelectorAll("pre > code[data-dartpad]:only-child"),n=u.N,m=A.C(n,n) +p=p.window +n=new A.e(m) +if(typeof n=="function")A.v(A.q("Attempting to rewrap a JS function.")) +t=function(a,b){return function(c){return a(b,c,arguments.length)}}(A.K,n) +t[$.w()]=n +p.addEventListener("message",t) +for(p=u.m,s=0;s").Kq(c).C("A8<1,2>"))}, +H(a,b){var t,s=A.O8(a.length,"",u.N) +for(t=0;t0)return a[t-1] +throw A.Og(A.Wp())}, +"["(a){return A.tA(a,"[","]")}, +gkz(a){return new J.D(a,a.length,A.t6(a).C("D<1>"))}, +gi(a){return A.eQ(a)}, +gB(a){return a.length}, +$ibQ:1, +$icX:1, +$izM:1} +J.Po.prototype={} +J.D.prototype={ +gl(){var t=this.d +return t==null?this.$ti.c.a(t):t}, +G(){var t,s=this,r=s.a,q=r.length +if(s.b!==q)throw A.Og(A.G(r)) +t=s.c +if(t>=q){s.d=null +return!1}s.d=r[t] +s.c=t+1 +return!0}} +J.qI.prototype={ +"["(a){if(a===0&&1/a<0)return"-0.0" +else return""+a}, +gi(a){var t,s,r,q,p=a|0 +if(a===p)return p&536870911 +t=Math.abs(a) +s=Math.log(t)/0.6931471805599453|0 +r=Math.pow(2,s) +q=t<1?t/r:r/t +return((q*9007199254740992|0)+(q*3542243181176521|0))*599197+s*1259&536870911}, +wG(a,b){var t +if(a>0)t=this.p(a,b) +else{t=b>31?31:b +t=a>>t>>>0}return t}, +bf(a,b){if(0>b)throw A.Og(A.tL(b)) +return this.p(a,b)}, +p(a,b){return b>31?0:a>>>b}, +gbx(a){return A.Kx(u.H)}, +$iCP:1} +J.bU.prototype={ +gbx(a){return A.Kx(u.S)}, +$iy5:1, +$iKN:1} +J.kD.prototype={ +gbx(a){return A.Kx(u.i)}, +$iy5:1} +J.Dr.prototype={ +h(a,b){return a+b}, +Y(a,b,c){var t +if(c<0||c>a.length)throw A.Og(A.TE(c,0,a.length,null,null)) +t=c+b.length +if(t>a.length)return!1 +return b===a.substring(c,t)}, +R(a,b){return this.Y(a,b,0)}, +Nj(a,b,c){return a.substring(b,A.jB(b,c,a.length))}, +yn(a,b){return this.Nj(a,b,null)}, +OF(a){var t,s=a.trimEnd(),r=s.length +if(r===0)return s +t=r-1 +if(s.charCodeAt(t)!==133)return s +return s.substring(0,J.c1(s,t))}, +I(a,b){var t,s +if(0>=b)return"" +if(b===1||a.length===0)return a +if(b!==b>>>0)throw A.Og(B.Eq) +for(t=a,s="";!0;){if((b&1)===1)s=t+s +b=b>>>1 +if(b===0)break +t+=t}return s}, +K(a,b,c){var t +if(c<0||c>a.length)throw A.Og(A.TE(c,0,a.length,null,null)) +t=a.indexOf(b,c) +return t}, +M(a,b){return this.K(a,b,0)}, +"["(a){return a}, +gi(a){var t,s,r +for(t=a.length,s=0,r=0;r>6}s=s+((s&67108863)<<3)&536870911 +s^=s>>11 +return s+((s&16383)<<15)&536870911}, +gbx(a){return A.Kx(u.N)}, +gB(a){return a.length}, +$iy5:1, +$iqU:1} +A.n.prototype={ +"["(a){return"LateInitializationError: "+this.a}} +A.zl.prototype={} +A.bQ.prototype={} +A.aL.prototype={ +gkz(a){var t=this +return new A.a7(t,t.gB(t),A.Lh(t).C("a7"))}, +H(a,b){var t,s,r,q=this,p=q.gB(q) +if(b.length!==0){if(p===0)return"" +t=A.I(q.F(0,0)) +if(p!==q.gB(q))throw A.Og(A.a4(q)) +for(s=t,r=1;r").Kq(c).C("A8<1,2>"))}} +A.a7.prototype={ +gl(){var t=this.d +return t==null?this.$ti.c.a(t):t}, +G(){var t,s=this,r=s.a,q=J.U6(r),p=q.gB(r) +if(s.b!==p)throw A.Og(A.a4(r)) +t=s.c +if(t>=p){s.d=null +return!1}s.d=q.F(r,t);++s.c +return!0}} +A.i1.prototype={ +gkz(a){var t=this.a +return new A.MH(t.gkz(t),this.b,A.Lh(this).C("MH<1,2>"))}, +gB(a){var t=this.a +return t.gB(t)}} +A.xy.prototype={$ibQ:1} +A.MH.prototype={ +G(){var t=this,s=t.b +if(s.G()){t.a=t.c.$1(s.gl()) +return!0}t.a=null +return!1}, +gl(){var t=this.a +return t==null?this.$ti.y[1].a(t):t}} +A.A8.prototype={ +gB(a){return J.Hm(this.a)}, +F(a,b){return this.b.$1(J.GA(this.a,b))}} +A.SU.prototype={} +A.S0.prototype={$r:"+code,id(1,2)",$s:1} +A.d.prototype={ +"["(a){var t=this.constructor,s=t==null?null:t.name +return"Closure '"+A.NQ(s==null?"unknown":s)+"'"}, +gKu(){return this}, +$C:"$1", +$R:1, +$D:null} +A.E1.prototype={$C:"$2",$R:2} +A.lc.prototype={} +A.zx.prototype={ +"["(a){var t=this.$static_name +if(t==null)return"Closure of unknown static method" +return"Closure '"+A.NQ(t)+"'"}} +A.rT.prototype={ +DN(a,b){if(b==null)return!1 +if(this===b)return!0 +if(!(b instanceof A.rT))return!1 +return this.$_target===b.$_target&&this.a===b.a}, +gi(a){return(A.CU(this.a)^A.eQ(this.$_target))>>>0}, +"["(a){return"Closure '"+this.$_name+"' of "+("Instance of '"+A.l(this.a)+"'")}} +A.GK.prototype={ +"["(a){return"Reading static variable '"+this.a+"' during its initialization"}} +A.Eq.prototype={ +"["(a){return"RuntimeError: "+this.a}} +A.N5.prototype={ +gB(a){return this.a}, +gv(){return new A.i5(this,this.$ti.C("i5<1>"))}, +q(a,b){var t,s,r,q,p=null +if(typeof b=="string"){t=this.b +if(t==null)return p +s=t[b] +r=s==null?p:s.b +return r}else if(typeof b=="number"&&(b&0x3fffffff)===b){q=this.c +if(q==null)return p +s=q[b] +r=s==null?p:s.b +return r}else return this.aa(b)}, +aa(a){var t,s,r=this.d +if(r==null)return null +t=r[J.Nu(a)&1073741823] +s=this.X(t,a) +if(s<0)return null +return t[s].b}, +t(a,b,c){var t,s,r,q,p,o,n=this +if(typeof b=="string"){t=n.b +n.m(t==null?n.b=n.A():t,b,c)}else if(typeof b=="number"&&(b&0x3fffffff)===b){s=n.c +n.m(s==null?n.c=n.A():s,b,c)}else{r=n.d +if(r==null)r=n.d=n.A() +q=J.Nu(b)&1073741823 +p=r[q] +if(p==null)r[q]=[n.O(b,c)] +else{o=n.X(p,b) +if(o>=0)p[o].b=c +else p.push(n.O(b,c))}}}, +j(a,b){var t=this.H4(this.b,b) +return t}, +aN(a,b){var t=this,s=t.e,r=t.r +for(;s!=null;){b.$2(s.a,s.b) +if(r!==t.r)throw A.Og(A.a4(t)) +s=s.c}}, +m(a,b,c){var t=a[b] +if(t==null)a[b]=this.O(b,c) +else t.b=c}, +H4(a,b){var t +if(a==null)return null +t=a[b] +if(t==null)return null +this.GS(t) +delete a[b] +return t.b}, +S(){this.r=this.r+1&1073741823}, +O(a,b){var t,s=this,r=new A.vh(a,b) +if(s.e==null)s.e=s.f=r +else{t=s.f +t.toString +r.d=t +s.f=t.c=r}++s.a +s.S() +return r}, +GS(a){var t=this,s=a.d,r=a.c +if(s==null)t.e=r +else s.c=r +if(r==null)t.f=s +else r.d=s;--t.a +t.S()}, +X(a,b){var t,s +if(a==null)return-1 +t=a.length +for(s=0;s"]=t +delete t[""] +return t}} +A.vh.prototype={} +A.i5.prototype={ +gB(a){return this.a.a}, +gkz(a){var t=this.a,s=new A.N6(t,t.r) +s.c=t.e +return s}} +A.N6.prototype={ +gl(){return this.d}, +G(){var t,s=this,r=s.a +if(s.b!==r.r)throw A.Og(A.a4(r)) +t=s.c +if(t==null){s.d=null +return!1}else{s.d=t.a +s.c=t.c +return!0}}} +A.dC.prototype={ +$1(a){return this.a(a)}} +A.wN.prototype={ +$2(a,b){return this.a(a,b)}} +A.VX.prototype={ +$1(a){return this.a(a)}} +A.M.prototype={ +"["(a){return this.k(!1)}, +k(a){var t,s,r,q,p,o=this.D(),n=this.n(),m=(a?""+"Record ":"")+"(" +for(t=o.length,s="",r=0;r0;){--r;--t +l[r]=s[t]}}l=A.u(l,!1,u.K) +l.fixed$length=Array +l.immutable$list=Array +return l}} +A.B7.prototype={ +n(){return[this.a,this.b]}, +DN(a,b){if(b==null)return!1 +return b instanceof A.B7&&this.$s===b.$s&&J.cf(this.a,b.a)&&J.cf(this.b,b.b)}, +gi(a){return A.f5(this.$s,this.a,this.b,B.zt)}} +A.VR.prototype={ +"["(a){return"RegExp/"+this.a+"/"+this.b.flags}} +A.WZ.prototype={ +gbx(a){return B.TE}, +$iy5:1, +$iI2:1} +A.eH.prototype={} +A.df.prototype={ +gbx(a){return B.hu}, +$iy5:1, +$iWy:1} +A.b0.prototype={ +gB(a){return a.length}, +$iXj:1} +A.Dg.prototype={ +q(a,b){A.od(b,a,a.length) +return a[b]}, +$ibQ:1, +$icX:1, +$izM:1} +A.DV.prototype={$ibQ:1,$icX:1,$izM:1} +A.zU.prototype={ +gbx(a){return B.Wj}, +$iy5:1, +$ioI:1} +A.K8.prototype={ +gbx(a){return B.Wu}, +$iy5:1, +$imJ:1} +A.xj.prototype={ +gbx(a){return B.Nh}, +q(a,b){A.od(b,a,a.length) +return a[b]}, +$iy5:1, +$irF:1} +A.dE.prototype={ +gbx(a){return B.vb}, +q(a,b){A.od(b,a,a.length) +return a[b]}, +$iy5:1, +$iX6:1} +A.ZA.prototype={ +gbx(a){return B.Zb}, +q(a,b){A.od(b,a,a.length) +return a[b]}, +$iy5:1, +$iZX:1} +A.wf.prototype={ +gbx(a){return B.BY}, +q(a,b){A.od(b,a,a.length) +return a[b]}, +$iy5:1, +$iHS:1} +A.Pq.prototype={ +gbx(a){return B.FN}, +q(a,b){A.od(b,a,a.length) +return a[b]}, +$iy5:1, +$iPz:1} +A.eE.prototype={ +gbx(a){return B.YD}, +gB(a){return a.length}, +q(a,b){A.od(b,a,a.length) +return a[b]}, +$iy5:1, +$izt:1} +A.V6.prototype={ +gbx(a){return B.mj}, +gB(a){return a.length}, +q(a,b){A.od(b,a,a.length) +return a[b]}, +$iy5:1, +$in6:1} +A.RG.prototype={} +A.vX.prototype={} +A.WB.prototype={} +A.VS.prototype={} +A.Jc.prototype={ +C(a){return A.cE(v.typeUniverse,this,a)}, +Kq(a){return A.v5(v.typeUniverse,this,a)}} +A.ET.prototype={} +A.lY.prototype={ +"["(a){return A.m(this.a,null)}} +A.u9.prototype={ +"["(a){return this.a}} +A.iM.prototype={} +A.k6.prototype={ +gB(a){return this.a}, +gv(){return new A.Ni(this,this.$ti.C("Ni<1>"))}, +x4(a){var t,s +if(typeof a=="string"&&a!=="__proto__"){t=this.b +return t==null?!1:t[a]!=null}else if(typeof a=="number"&&(a&1073741823)===a){s=this.c +return s==null?!1:s[a]!=null}else return this.KY(a)}, +KY(a){var t=this.d +if(t==null)return!1 +return this.DF(this.e1(t,a),a)>=0}, +q(a,b){var t,s,r +if(typeof b=="string"&&b!=="__proto__"){t=this.b +s=t==null?null:A.vL(t,b) +return s}else if(typeof b=="number"&&(b&1073741823)===b){r=this.c +s=r==null?null:A.vL(r,b) +return s}else return this.c8(b)}, +c8(a){var t,s,r=this.d +if(r==null)return null +t=this.e1(r,a) +s=this.DF(t,a) +return s<0?null:t[s+1]}, +t(a,b,c){var t,s,r,q=this,p=q.d +if(p==null)p=q.d=A.a0() +t=A.CU(b)&1073741823 +s=p[t] +if(s==null){A.cW(p,t,[b,c]);++q.a +q.e=null}else{r=q.DF(s,b) +if(r>=0)s[r+1]=c +else{s.push(b,c);++q.a +q.e=null}}}, +aN(a,b){var t,s,r,q,p,o=this,n=o.Cf() +for(t=n.length,s=o.$ti.y[1],r=0;r"))}} +A.t3.prototype={ +gl(){var t=this.d +return t==null?this.$ti.c.a(t):t}, +G(){var t=this,s=t.b,r=t.c,q=t.a +if(s!==q.e)throw A.Og(A.a4(q)) +else if(r>=s.length){t.d=null +return!1}else{t.d=s[r] +t.c=r+1 +return!0}}} +A.F.prototype={ +gkz(a){return new A.a7(a,this.gB(a),A.z(a).C("a7"))}, +F(a,b){return this.q(a,b)}, +E2(a,b,c){return new A.A8(a,b,A.z(a).C("@").Kq(c).C("A8<1,2>"))}, +"["(a){return A.tA(a,"[","]")}} +A.il.prototype={ +aN(a,b){var t,s,r,q +for(t=this.gv(),t=t.gkz(t),s=A.Lh(this).y[1];t.G();){r=t.gl() +q=this.q(0,r) +b.$2(r,q==null?s.a(q):q)}}, +gB(a){var t=this.gv() +return t.gB(t)}, +"["(a){return A.nO(this)}} +A.mN.prototype={ +$2(a,b){var t,s=this.a +if(!s.a)this.b.a+=", " +s.a=!1 +s=this.b +t=A.I(a) +t=s.a+=t +s.a=t+": " +t=A.I(b) +s.a+=t}} +A.Uk.prototype={} +A.wI.prototype={} +A.Zi.prototype={} +A.u5.prototype={} +A.E3.prototype={ +W(a){var t,s,r,q=A.jB(0,null,a.length) +if(q===0)return new Uint8Array(0) +t=q*3 +s=new Uint8Array(t) +r=new A.Rw(s) +if(r.T(a,0,q)!==q)r.RO() +return new Uint8Array(s.subarray(0,A.rM(0,r.b,t)))}} +A.Rw.prototype={ +RO(){var t=this,s=t.c,r=t.b,q=t.b=r+1 +s[r]=239 +r=t.b=q+1 +s[q]=191 +t.b=r+1 +s[r]=189}, +O6(a,b){var t,s,r,q,p=this +if((b&64512)===56320){t=65536+((a&1023)<<10)|b&1023 +s=p.c +r=p.b +q=p.b=r+1 +s[r]=t>>>18|240 +r=p.b=q+1 +s[q]=t>>>12&63|128 +q=p.b=r+1 +s[r]=t>>>6&63|128 +p.b=q+1 +s[q]=t&63|128 +return!0}else{p.RO() +return!1}}, +T(a,b,c){var t,s,r,q,p,o,n,m=this +if(b!==c&&(a.charCodeAt(c-1)&64512)===55296)--c +for(t=m.c,s=t.length,r=b;r=s)break +m.b=p+1 +t[p]=q}else{p=q&64512 +if(p===55296){if(m.b+4>s)break +o=r+1 +if(m.O6(q,a.charCodeAt(o)))r=o}else if(p===56320){if(m.b+3>s)break +m.RO()}else if(q<=2047){p=m.b +n=p+1 +if(n>=s)break +m.b=n +t[p]=q>>>6|192 +m.b=n+1 +t[n]=q&63|128}else{p=m.b +if(p+2>=s)break +n=m.b=p+1 +t[p]=q>>>12|224 +p=m.b=n+1 +t[n]=q>>>6&63|128 +m.b=p+1 +t[p]=q&63|128}}}return r}} +A.bp.prototype={ +$2(a,b){var t,s +if(typeof b=="string")this.a.set(a,b) +else if(b==null)this.a.set(a,"") +else for(t=J.p(b),s=this.a;t.G();){b=t.gl() +if(typeof b=="string")s.append(a,b) +else if(b==null)s.append(a,"") +else A.tE(b)}}} +A.Ge.prototype={} +A.C6.prototype={ +"["(a){var t=this.a +if(t!=null)return"Assertion failed: "+A.h(t) +return"Assertion failed"}} +A.E.prototype={} +A.AT.prototype={ +gZ(){return"Invalid argument"+(!this.a?"(s)":"")}, +gN(){return""}, +"["(a){var t=this,s=t.c,r=s==null?"":" ("+s+")",q=t.d,p=q==null?"":": "+q,o=t.gZ()+r+p +if(!t.a)return o +return o+t.gN()+": "+A.h(t.gE())}, +gE(){return this.b}} +A.bJ.prototype={ +gE(){return this.b}, +gZ(){return"RangeError"}, +gN(){var t,s=this.e,r=this.f +if(s==null)t=r!=null?": Not less than or equal to "+A.I(r):"" +else if(r==null)t=": Not greater than or equal to "+A.I(s) +else if(r>s)t=": Not in inclusive range "+A.I(s)+".."+A.I(r) +else t=rf.length +else t=!1 +if(t)g=null +if(g==null){if(f.length>78)f=B.xB.Nj(f,0,75)+"..." +return h+"\n"+f}for(s=1,r=0,q=!1,p=0;p1?h+(" (at line "+s+", character "+(g-r+1)+")\n"):h+(" (at character "+(g+1)+")\n") +n=f.length +for(p=g;p78){l="..." +if(g-r<75){k=r+75 +j=r}else{if(n-g<75){j=n-75 +k=n +l=""}else{j=g-36 +k=g+36}m="..."}}else{k=n +j=r +l=""}return h+m+B.xB.Nj(f,j,k)+l+"\n"+B.xB.I(" ",g-j+m.length)+"^\n"}else return g!=null?h+(" (at offset "+A.I(g)+")"):h}} +A.cX.prototype={ +E2(a,b,c){return A.K1(this,b,A.Lh(this).C("cX.E"),c)}, +gB(a){var t,s=this.gkz(this) +for(t=0;s.G();)++t +return t}, +F(a,b){var t,s +A.k1(b,"index") +t=this.gkz(this) +for(s=b;t.G();){if(s===0)return t.gl();--s}throw A.Og(A.xF(b,b-s,this,"index"))}, +"["(a){return A.Sd(this,"(",")")}} +A.c8.prototype={ +gi(a){return A.a.prototype.gi.call(this,0)}, +"["(a){return"null"}} +A.a.prototype={$ia:1, +DN(a,b){return this===b}, +gi(a){return A.eQ(this)}, +"["(a){return"Instance of '"+A.l(this)+"'"}, +gbx(a){return A.RW(this)}, +toString(){return this["["](this)}} +A.Rn.prototype={ +gB(a){return this.a.length}, +"["(a){var t=this.a +return t.charCodeAt(0)==0?t:t}} +A.cS.prototype={ +$2(a,b){throw A.Og(A.rr("Illegal IPv4 address, "+a,this.a,b))}} +A.VC.prototype={ +$2(a,b){throw A.Og(A.rr("Illegal IPv6 address, "+a,this.a,b))}} +A.JT.prototype={ +$2(a,b){var t +if(b-a>4)this.a.$2("an IPv6 part can only contain a maximum of 4 hex digits",a) +t=A.QA(B.xB.Nj(this.b,a,b),16) +if(t<0||t>65535)this.a.$2("each part must be in the range of `0x0..0xFFFF`",a) +return t}} +A.Dn.prototype={ +gL(){var t,s,r,q,p=this,o=p.w +if(o===$){t=p.a +s=t.length!==0?""+t+":":"" +r=p.c +q=r==null +if(!q||t==="file"){t=s+"//" +s=p.b +if(s.length!==0)t=t+s+"@" +if(!q)t+=r +s=p.d +if(s!=null)t=t+":"+A.I(s)}else t=s +t+=p.e +s=p.f +if(s!=null)t=t+"?"+s +s=p.r +if(s!=null)t=t+"#"+s +o!==$&&A.kL() +o=p.w=t.charCodeAt(0)==0?t:t}return o}, +gi(a){var t,s=this,r=s.y +if(r===$){t=B.xB.gi(s.gL()) +s.y!==$&&A.kL() +s.y=t +r=t}return r}, +gP(){var t=this.c +if(t==null)return"" +if(B.xB.R(t,"["))return B.xB.Nj(t,1,t.length-1) +return t}, +gtp(){var t=this.d +return t==null?A.wK(this.a):t}, +"["(a){return this.gL()}, +DN(a,b){var t,s,r,q,p,o=this +if(b==null)return!1 +if(o===b)return!0 +t=!1 +if(b instanceof A.Dn)if(o.a===b.a)if(o.c!=null===(b.c!=null))if(o.b===b.b)if(o.gP()===b.gP())if(o.gtp()===b.gtp())if(o.e===b.e){s=o.f +r=s==null +q=b.f +p=q==null +if(!r===!p){if(r)s="" +if(s===(p?"":q)){s=o.r +r=s==null +q=b.r +p=q==null +if(!r===!p){t=r?"":s +t=t===(p?"":q)}}}}return t}} +A.RZ.prototype={ +$1(a){return A.eP(B.Ji,a,B.xM,!1)}} +A.IP.prototype={ +$2(a,b){var t=this.b,s=this.a +t.a+=s.a +s.a="&" +s=A.eP(B.fY,a,B.xM,!0) +s=t.a+=s +if(b!=null&&b.length!==0){t.a=s+"=" +s=A.eP(B.fY,b,B.xM,!0) +t.a+=s}}} +A.fq.prototype={ +$2(a,b){var t,s +if(b==null||typeof b=="string")this.a.$2(a,b) +else for(t=J.p(b),s=this.a;t.G();)s.$2(a,t.gl())}} +A.Pb.prototype={ +$1(a){var t,s,r,q +if(A.m6(a))return a +t=this.a +if(t.x4(a))return t.q(0,a) +if(a instanceof A.il){s={} +t.t(0,a,s) +for(t=a.gv(),t=t.gkz(t);t.G();){r=t.gl() +s[r]=this.$1(a.q(0,r))}return s}else if(u.x.b(a)){q=[] +t.t(0,a,q) +B.Nm.FV(q,J.M1(a,this,u.z)) +return q}else return a}} +A.lM.prototype={} +A.YE.prototype={ +U(){this.a=Math.max(18,5)}, +W(a){var t,s,r,q,p,o,n,m,l,k,j,i,h,g=a.length +if(!A.m2(a,"&",0))return a +t=new A.Rn("") +for(s=0;!0;){r=B.xB.K(a,"&",s) +if(r===-1){t.a+=B.xB.yn(a,s) +break}q=t.a+=B.xB.Nj(a,s,r) +p=this.a +p===$&&A.Q4() +o=B.xB.Nj(a,r,Math.min(g,r+p)) +if(o.length>4&&o.charCodeAt(1)===35){n=B.xB.M(o,";") +if(n!==-1){m=o.charCodeAt(2)===120 +l=B.xB.Nj(o,m?3:2,n) +k=A.Hp(l,m?16:10) +if(k==null)k=-1 +if(k!==-1){t.a=q+A.Lw(k) +s=r+(n+1) +continue}}}i=0 +while(!0){if(!(i<268)){s=r +j=!1 +break}h=B.Fa[i] +if(B.xB.R(o,h)){t.a+=B.Zn[i] +s=r+h.length +j=!0 +break}++i}if(!j){t.a+="&";++s}}g=t.a +return g.charCodeAt(0)==0?g:g}} +A.TZ.prototype={ +gB(a){return this.a.length}} +A.e.prototype={ +$1(a){var t,s,r,q,p,o,n=null,m=a.data,l=u.m,k=n,j=!1 +if(l.b(m)){t=m.type +s=t +if(s!=null){r=t==null?A.Bt(t):t +q=m.sender +s=q +if(s!=null){k=q==null?A.Bt(q):q +j=r==="ready"}}}if(j){j=this.a +p=j.q(0,k) +if(p!=null){o=self.document.getElementById(k) +if(o==null)o=l.a(o) +l=A.hy(o.contentWindow) +if(l!=null){s=u.N +s=A.Pe(A.EF(["sourceCode",p,"type","sourceCode"],s,s)) +l=l.a +l.postMessage(s,"*")}j.j(0,k)}}}};(function aliases(){var t=J.zh.prototype +t.u=t["["]})();(function inheritance(){var t=hunkHelpers.mixin,s=hunkHelpers.inherit,r=hunkHelpers.inheritMany +s(A.a,null) +r(A.a,[A.FK,J.vB,J.D,A.Ge,A.zl,A.cX,A.a7,A.MH,A.SU,A.M,A.d,A.il,A.vh,A.N6,A.VR,A.Jc,A.ET,A.lY,A.t3,A.F,A.Uk,A.wI,A.Rw,A.k5,A.aE,A.c8,A.Rn,A.Dn,A.TZ]) +r(J.vB,[J.yE,J.CD,J.MF,J.rQ,J.Dw,J.qI,J.Dr]) +r(J.MF,[J.zh,J.jd,A.WZ,A.eH]) +r(J.zh,[J.iC,J.kd,J.c5]) +s(J.Po,J.jd) +r(J.qI,[J.bU,J.kD]) +r(A.Ge,[A.n,A.GK,A.Eq,A.u9,A.C6,A.E,A.AT,A.ub,A.ds,A.lj,A.UV]) +r(A.cX,[A.bQ,A.i1]) +r(A.bQ,[A.aL,A.i5,A.Ni]) +s(A.xy,A.i1) +s(A.A8,A.aL) +s(A.B7,A.M) +s(A.S0,A.B7) +r(A.d,[A.E1,A.lc,A.dC,A.VX,A.RZ,A.Pb,A.e]) +r(A.lc,[A.zx,A.rT]) +r(A.il,[A.N5,A.k6]) +r(A.E1,[A.wN,A.mN,A.bp,A.cS,A.VC,A.JT,A.IP,A.fq]) +r(A.eH,[A.df,A.b0]) +r(A.b0,[A.RG,A.WB]) +s(A.vX,A.RG) +s(A.Dg,A.vX) +s(A.VS,A.WB) +s(A.DV,A.VS) +r(A.Dg,[A.zU,A.K8]) +r(A.DV,[A.xj,A.dE,A.ZA,A.wf,A.Pq,A.eE,A.V6]) +s(A.iM,A.u9) +s(A.YF,A.k6) +s(A.Zi,A.Uk) +s(A.u5,A.Zi) +r(A.wI,[A.E3,A.YE]) +r(A.AT,[A.bJ,A.eY]) +s(A.lM,A.YE) +t(A.RG,A.F) +t(A.vX,A.SU) +t(A.WB,A.F) +t(A.VS,A.SU)})() +var v={typeUniverse:{eC:new Map(),tR:{},eT:{},tPV:{},sEA:[]},mangledGlobalNames:{KN:"int",CP:"double",lf:"num",qU:"String",a2:"bool",c8:"Null",zM:"List",a:"Object",T8:"Map"},mangledNames:{},types:[],interceptorsByTag:null,leafTags:null,arrayRti:Symbol("$ti"),rttc:{"2;code,id":(a,b)=>c=>c instanceof A.S0&&a.b(c.a)&&b.b(c.b)}} +A.xb(v.typeUniverse,JSON.parse('{"iC":"zh","kd":"zh","c5":"zh","yE":{"y5":[]},"CD":{"y5":[]},"MF":{"vm":[]},"zh":{"vm":[]},"jd":{"zM":["1"],"bQ":["1"],"vm":[],"cX":["1"]},"Po":{"jd":["1"],"zM":["1"],"bQ":["1"],"vm":[],"cX":["1"]},"qI":{"CP":[]},"bU":{"CP":[],"KN":[],"y5":[]},"kD":{"CP":[],"y5":[]},"Dr":{"qU":[],"y5":[]},"bQ":{"cX":["1"]},"aL":{"bQ":["1"],"cX":["1"]},"i1":{"cX":["2"],"cX.E":"2"},"xy":{"i1":["1","2"],"bQ":["2"],"cX":["2"],"cX.E":"2"},"A8":{"aL":["2"],"bQ":["2"],"cX":["2"],"aL.E":"2","cX.E":"2"},"N5":{"il":["1","2"]},"i5":{"bQ":["1"],"cX":["1"],"cX.E":"1"},"WZ":{"vm":[],"I2":[],"y5":[]},"eH":{"vm":[]},"df":{"Wy":[],"vm":[],"y5":[]},"b0":{"Xj":["1"],"vm":[]},"Dg":{"F":["CP"],"zM":["CP"],"Xj":["CP"],"bQ":["CP"],"vm":[],"cX":["CP"]},"DV":{"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"]},"zU":{"oI":[],"F":["CP"],"zM":["CP"],"Xj":["CP"],"bQ":["CP"],"vm":[],"cX":["CP"],"y5":[],"F.E":"CP"},"K8":{"mJ":[],"F":["CP"],"zM":["CP"],"Xj":["CP"],"bQ":["CP"],"vm":[],"cX":["CP"],"y5":[],"F.E":"CP"},"xj":{"rF":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"dE":{"X6":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"ZA":{"ZX":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"wf":{"HS":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"Pq":{"Pz":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"eE":{"zt":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"V6":{"n6":[],"F":["KN"],"zM":["KN"],"Xj":["KN"],"bQ":["KN"],"vm":[],"cX":["KN"],"y5":[],"F.E":"KN"},"k6":{"il":["1","2"]},"YF":{"k6":["1","2"],"il":["1","2"]},"Ni":{"bQ":["1"],"cX":["1"],"cX.E":"1"},"zM":{"bQ":["1"],"cX":["1"]},"ZX":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"n6":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"zt":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"rF":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"HS":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"X6":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"Pz":{"zM":["KN"],"bQ":["KN"],"cX":["KN"]},"oI":{"zM":["CP"],"bQ":["CP"],"cX":["CP"]},"mJ":{"zM":["CP"],"bQ":["CP"],"cX":["CP"]}}')) +A.FF(v.typeUniverse,JSON.parse('{"bQ":1,"SU":1,"N6":1,"b0":1,"Uk":2,"wI":2}')) +var u=(function rtii(){var t=A.q7 +return{J:t("I2"),Y:t("Wy"),Q:t("bQ<@>"),B:t("oI"),q:t("mJ"),Z:t("EH"),O:t("rF"),k:t("X6"),U:t("ZX"),x:t("cX"),f:t("jd"),s:t("jd"),b:t("jd<@>"),t:t("jd"),T:t("CD"),m:t("vm"),g:t("c5"),p:t("Xj<@>"),P:t("c8"),K:t("a"),L:t("VY"),F:t("+()"),N:t("qU"),R:t("y5"),D:t("HS"),v:t("Pz"),e:t("zt"),E:t("n6"),o:t("kd"),G:t("YF"),y:t("a2"),i:t("CP"),z:t("@"),S:t("KN"),A:t("0&*"),_:t("a*"),V:t("b8?"),X:t("a?"),H:t("lf")}})();(function constants(){var t=hunkHelpers.makeConstList +B.Ok=J.vB.prototype +B.Nm=J.jd.prototype +B.jn=J.bU.prototype +B.xB=J.Dr.prototype +B.DG=J.c5.prototype +B.Ub=J.MF.prototype +B.ZQ=J.iC.prototype +B.vB=J.kd.prototype +B.O4=function getTagFallback(o) { + var s = Object.prototype.toString.call(o); + return s.substring(8, s.length - 1); +} +B.Yq=function() { + var toStringFunction = Object.prototype.toString; + function getTag(o) { + var s = toStringFunction.call(o); + return s.substring(8, s.length - 1); + } + function getUnknownTag(object, tag) { + if (/^HTML[A-Z].*Element$/.test(tag)) { + var name = toStringFunction.call(object); + if (name == "[object Object]") return null; + return "HTMLElement"; + } + } + function getUnknownTagGenericBrowser(object, tag) { + if (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 HTMLElement == "function"; + return { + getTag: getTag, + getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag, + prototypeForTag: prototypeForTag, + discriminator: discriminator }; +} +B.wb=function(getTagFallback) { + return function(hooks) { + if (typeof navigator != "object") return hooks; + var userAgent = navigator.userAgent; + if (typeof userAgent != "string") return hooks; + if (userAgent.indexOf("DumpRenderTree") >= 0) return hooks; + if (userAgent.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; + }; +} +B.KU=function(hooks) { + if (typeof dartExperimentalFixupGetTag != "function") return hooks; + hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag); +} +B.dk=function(hooks) { + if (typeof navigator != "object") return hooks; + var userAgent = navigator.userAgent; + if (typeof userAgent != "string") return hooks; + 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; +} +B.xi=function(hooks) { + if (typeof navigator != "object") return hooks; + var userAgent = navigator.userAgent; + if (typeof userAgent != "string") return hooks; + 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; +} +B.fQ=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; +} +B.i7=function(hooks) { return hooks; } + +B.Eq=new A.k5() +B.zt=new A.zl() +B.xM=new A.u5() +B.Qk=new A.E3() +B.TA=A.j(t([0,0,32722,12287,65534,34815,65534,18431]),u.t) +B.IB=A.j(t([0,0,32754,11263,65534,34815,65534,18431]),u.t) +B.Ho=A.j(t([0,0,26624,1023,65534,2047,65534,2047]),u.t) +B.Ji=A.j(t([0,0,32722,12287,65535,34815,65534,18431]),u.t) +B.Fa=A.j(t(["`"," ","´","|","·","¨","±","·","_","®","¸"," ","¦","%","*","{","|",".","}","ý","¤","ú","õ","=","ù","@","ø","±","÷","[","$","·","]","Ó","_","¼","½","¾","¿","À","Á","Ã","ó","È","É","Ì","Í","Ñ","Ò","Õ","Ø","Ù","Ú","Ý","à","á","ã","ç","è","é","ì","í","ñ","ò","Ç","ê","´","¤","ô","¦","ó","£","ò","ù","ñ",":","«","î","ø","í","þ","ý","÷","È","ì","¯","¡","±","é","ß","è","µ","ç","·","¸","û","æ",",","»","ú","¼","½","?","¾","¿","À","Á","Â","Ã","Å","Å","Æ","å","Þ","É","Ê","Ì","ã","Í","Î","â","`","Ñ","Ò","á","Ó","Ô","fj","Õ","à","×","õ","Ø","Ù","Ú","Û","Ý","Ç","¯","²","[",";","³","Â","\","+","Ä","å","ô","´","Å","§","Æ","©","µ","]","×","ÿ","¶","¢","Ê","Ë","ä","þ"," ","ü","ö","û","Î","Ï","}","â","©","¸","¡","'","¹","ª","º","ï","Ô","£","»","Ö","«","ë",">⃒","(",""","{","½",")","î","ê","Û","Ü","ß","|","!","<⃒","Þ",""","æ","=⃥","Ö",""","ÿ","ö","Ð","Ï","&","Ë","ä","&","Ä","¹","º","*","¶"," ","#","³","²","­","ü","÷","ë","°","¯","®","®","Ü","¬","ª","ï","ð","©","©","¨","¢","¨","¨","§","/",""","¥"," ","^","Ð","±","°","®","®","­","¬","¨","¥",">",">","<","<","&","&","ð",">",">","<","<"]),u.s) +B.Eb=A.j(t([0,0,32776,33792,1,10240,0,0]),u.t) +B.fY=A.j(t([0,0,24576,1023,65534,34815,65534,18431]),u.t) +B.Zn=A.j(t(["`","\xa0","\xb4","|","\xb7","\xa8","\xb1","\xb7","_","\xae","\xb8","\n","\xa6","%","*","{","|",".","}","\xfd","\xa4","\xfa","\xf5","=","\xf9","@","\xf8","\xb1","\xf7","[","$","\xb7","]","\xd3","_","\xbc","\xbd","\xbe","\xbf","\xc0","\xc1","\xc3","\xf3","\xc8","\xc9","\xcc","\xcd","\xd1","\xd2","\xd5","\xd8","\xd9","\xda","\xdd","\xe0","\xe1","\xe3","\xe7","\xe8","\xe9","\xec","\xed","\xf1","\xf2","\xc7","\xea","\xb4","\xa4","\xf4","\xa6","\xf3","\xa3","\xf2","\xf9","\xf1",":","\xab","\xee","\xf8","\xed","\xfe","\xfd","\xf7","\xc8","\xec","\xaf","\xa1","\xb1","\xe9","\xdf","\xe8","\xb5","\xe7","\xb7","\xb8","\xfb","\xe6",",","\xbb","\xfa","\xbc","\xbd","?","\xbe","\xbf","\xc0","\xc1","\xc2","\xc3","\xc5","\xc5","\xc6","\xe5","\xde","\xc9","\xca","\xcc","\xe3","\xcd","\xce","\xe2","`","\xd1","\xd2","\xe1","\xd3","\xd4","f","\xd5","\xe0","\xd7","\xf5","\xd8","\xd9","\xda","\xdb","\xdd","\xc7","\xaf","\xb2","[",";","\xb3","\xc2","\\","+","\xc4","\xe5","\xf4","\xb4","\xc5","\xa7","\xc6","\xa9","\xb5","]","\xd7","\xff","\xb6","\xa2","\xca","\xcb","\xe4","\xfe","\xa0","\xfc","\xf6","\xfb","\xce","\xcf","}","\xe2","\xa9","\xb8","\xa1","'","\xb9","\xaa","\xba","\xef","\xd4","\xa3","\xbb","\xd6","\xab","\xeb",">","(",'"',"{","\xbd",")","\xee","\xea","\xdb","\xdc","\xdf","|","!","<","\xde",'"',"\xe6","=","\xd6",'"',"\xff","\xf6","\xd0","\xcf","&","\xcb","\xe4","&","\xc4","\xb9","\xba","*","\xb6","\xa0","#","\xb3","\xb2","\xad","\xfc","\xf7","\xeb","\xb0","\xaf","\xae","\xae","\xdc","\xac","\xaa","\xef","\xf0","\xa9","\xa9","\xa8","\xa2","\xa8","\xa8","\xa7","/",'"',"\xa5","\t","^","\xd0","\xb1","\xb0","\xae","\xae","\xad","\xac","\xa8","\xa5",">",">","<","<","&","&","\xf0",">",">","<","<"]),u.s) +B.TE=A.xq("I2") +B.hu=A.xq("Wy") +B.Wj=A.xq("oI") +B.Wu=A.xq("mJ") +B.Nh=A.xq("rF") +B.vb=A.xq("X6") +B.Zb=A.xq("ZX") +B.ug=A.xq("a") +B.BY=A.xq("HS") +B.FN=A.xq("Pz") +B.YD=A.xq("zt") +B.mj=A.xq("n6")})();(function staticFields(){$.zm=null +$.Qu=A.j([],u.f) +$.xu=null +$.i0=null +$.Hb=null +$.NF=null +$.TX=null +$.x7=null +$.nw=null +$.vv=null +$.Bv=null +$.B=A.j([],A.q7("jd?>")) +$.ra=0})();(function lazyInitializers(){var t=hunkHelpers.lazyFinal +t($,"fa","w",()=>A.Yg("_$dart_dartClosure")) +t($,"mf","z4",()=>A.nu("^[\\-\\.0-9A-Z_a-z~]*$")) +t($,"Cc","Ob",()=>typeof URLSearchParams=="function") +t($,"X0","t8",()=>A.CU(B.ug)) +t($,"Zj","Ww",()=>{var s=new A.lM() +s.U() +return s})})();(function nativeSupport(){!function(){var t=function(a){var n={} +n[a]=1 +return Object.keys(hunkHelpers.convertToFastObject(n))[0]} +v.getIsolateTag=function(a){return t("___dart_"+a+v.isolateTag)} +var s="___dart_isolate_tags_" +var r=Object[s]||(Object[s]=Object.create(null)) +var q="_ZxYxX" +for(var p=0;;p++){var o=t(q+"_"+p+"_") +if(!(o in r)){r[o]=1 +v.isolateTag=o +break}}v.dispatchPropertyName=v.getIsolateTag("dispatch_record")}() +hunkHelpers.setOrUpdateInterceptorsByTag({ArrayBuffer:A.WZ,ArrayBufferView:A.eH,DataView:A.df,Float32Array:A.zU,Float64Array:A.K8,Int16Array:A.xj,Int32Array:A.dE,Int8Array:A.ZA,Uint16Array:A.wf,Uint32Array:A.Pq,Uint8ClampedArray:A.eE,CanvasPixelArray:A.eE,Uint8Array:A.V6}) +hunkHelpers.setOrUpdateLeafTags({ArrayBuffer:true,ArrayBufferView:false,DataView:true,Float32Array:true,Float64Array:true,Int16Array:true,Int32Array:true,Int8Array:true,Uint16Array:true,Uint32Array:true,Uint8ClampedArray:true,CanvasPixelArray:true,Uint8Array:false}) +A.b0.$nativeSuperclassTag="ArrayBufferView" +A.RG.$nativeSuperclassTag="ArrayBufferView" +A.vX.$nativeSuperclassTag="ArrayBufferView" +A.Dg.$nativeSuperclassTag="ArrayBufferView" +A.WB.$nativeSuperclassTag="ArrayBufferView" +A.VS.$nativeSuperclassTag="ArrayBufferView" +A.DV.$nativeSuperclassTag="ArrayBufferView"})() +Function.prototype.$0=function(){return this()} +Function.prototype.$1=function(a){return this(a)} +Function.prototype.$2=function(a,b){return this(a,b)} +Function.prototype.$1$1=function(a){return this(a)} +convertAllToFastObject(w) +convertToFastObject($);(function(a){if(typeof document==="undefined"){a(null) +return}if(typeof document.currentScript!="undefined"){a(document.currentScript) +return}var t=document.scripts +function onLoad(b){for(var r=0;r specifiedHost, + _ => 'dartpad.cn', + }; + + final iframeUrl = Uri.https(urlAuthority, '', { + if (codeElement.getAttribute('data-embed') != 'false') 'embed': 'true', + if (codeElement.getAttribute('data-theme') == 'light') 'theme': 'light', + if (codeElement.getAttribute('data-run') == 'true') 'run': 'true', + }).toString(); - final host = web.document.createElement('div') as web.HTMLElement; - final iframe = web.document.createElement('iframe') as web.HTMLIFrameElement; + final host = web.HTMLDivElement(); + final iframe = web.HTMLIFrameElement(); iframe.setAttribute('src', iframeUrl); if (codeElement.getAttribute('title') case final title? @@ -89,7 +84,8 @@ int _currentEmbed = 0; iframe.style.height = height; } - final content = _htmlUnescape.convert(codeElement.innerHTML.trimRight()); + final content = + _htmlUnescape.convert(codeElement.innerHTML.toString().trimRight()); host.appendChild(iframe); parent.replaceWith(host); @@ -104,14 +100,3 @@ extension type _EmbedReadyMessage._(JSObject _) { external String? get type; external String? get sender; } - -extension on web.HTMLIFrameElement { - void safelyPostMessage( - JSAny? message, - String optionsOrTargetOrigin, - ) { - (this as JSObject) - .getProperty('contentWindow'.toJS) - .callMethod('postMessage'.toJS, message, optionsOrTargetOrigin.toJS); - } -}