From 5edfc2f17a036f3c946f92b5946c45922cd99d1d Mon Sep 17 00:00:00 2001 From: Elizabeth Gaston Date: Tue, 3 May 2022 10:34:53 -0500 Subject: [PATCH 01/10] Update app_en.arb (#310) --- lib/l10n/arb/app_en.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index 562d9b1f..162b0d19 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -20,7 +20,7 @@ "@flipperControls": { "description": "Text displayed on the how to play dialog with the flipper controls" }, - "tapAndHoldRocket": "Tap & Hold Rocket", + "tapAndHoldRocket": "Tap Rocket", "@tapAndHoldRocket": { "description": "Text displayed on the how to launch on mobile" }, From 58468bde2ff1ea9aa1769d0bbd473f9b589863e6 Mon Sep 17 00:00:00 2001 From: Jorge Coca Date: Tue, 3 May 2022 10:42:24 -0500 Subject: [PATCH 02/10] feat: improve UI of the initial loading screen (#309) --- lib/assets_manager/assets_manager.dart | 2 + .../cubit/assets_manager_cubit.dart | 0 .../cubit/assets_manager_state.dart | 0 .../views/assets_loading_page.dart | 46 +++++++++++++ lib/assets_manager/views/views.dart | 1 + lib/game/game.dart | 1 - lib/game/view/pinball_game_page.dart | 35 +++------- lib/l10n/arb/app_en.arb | 8 +++ .../lib/src/theme/pinball_colors.dart | 5 ++ .../src/widgets/animated_ellipsis_text.dart | 61 +++++++++++++++++ .../lib/src/widgets/crt_background.dart | 23 +++++++ .../widgets/pinball_loading_indicator.dart | 66 +++++++++++++++++++ .../pinball_ui/lib/src/widgets/widgets.dart | 3 + .../test/src/theme/pinball_colors_test.dart | 20 ++++++ .../widgets/animated_ellipsis_text_test.dart | 30 +++++++++ .../test/src/widgets/crt_background_test.dart | 25 +++++++ .../pinball_loading_indicator_test.dart | 45 +++++++++++++ .../cubit/assets_manager_cubit_test.dart | 2 +- .../cubit/assets_manager_state_test.dart | 2 +- .../views/assets_loading_page_test.dart | 38 +++++++++++ test/game/view/pinball_game_page_test.dart | 11 +--- test/helpers/pump_app.dart | 1 + 22 files changed, 387 insertions(+), 38 deletions(-) create mode 100644 lib/assets_manager/assets_manager.dart rename lib/{game => }/assets_manager/cubit/assets_manager_cubit.dart (100%) rename lib/{game => }/assets_manager/cubit/assets_manager_state.dart (100%) create mode 100644 lib/assets_manager/views/assets_loading_page.dart create mode 100644 lib/assets_manager/views/views.dart create mode 100644 packages/pinball_ui/lib/src/widgets/animated_ellipsis_text.dart create mode 100644 packages/pinball_ui/lib/src/widgets/crt_background.dart create mode 100644 packages/pinball_ui/lib/src/widgets/pinball_loading_indicator.dart create mode 100644 packages/pinball_ui/test/src/widgets/animated_ellipsis_text_test.dart create mode 100644 packages/pinball_ui/test/src/widgets/crt_background_test.dart create mode 100644 packages/pinball_ui/test/src/widgets/pinball_loading_indicator_test.dart rename test/{game => }/assets_manager/cubit/assets_manager_cubit_test.dart (93%) rename test/{game => }/assets_manager/cubit/assets_manager_state_test.dart (98%) create mode 100644 test/assets_manager/views/assets_loading_page_test.dart diff --git a/lib/assets_manager/assets_manager.dart b/lib/assets_manager/assets_manager.dart new file mode 100644 index 00000000..438b75d1 --- /dev/null +++ b/lib/assets_manager/assets_manager.dart @@ -0,0 +1,2 @@ +export 'cubit/assets_manager_cubit.dart'; +export 'views/views.dart'; diff --git a/lib/game/assets_manager/cubit/assets_manager_cubit.dart b/lib/assets_manager/cubit/assets_manager_cubit.dart similarity index 100% rename from lib/game/assets_manager/cubit/assets_manager_cubit.dart rename to lib/assets_manager/cubit/assets_manager_cubit.dart diff --git a/lib/game/assets_manager/cubit/assets_manager_state.dart b/lib/assets_manager/cubit/assets_manager_state.dart similarity index 100% rename from lib/game/assets_manager/cubit/assets_manager_state.dart rename to lib/assets_manager/cubit/assets_manager_state.dart diff --git a/lib/assets_manager/views/assets_loading_page.dart b/lib/assets_manager/views/assets_loading_page.dart new file mode 100644 index 00000000..ddb76803 --- /dev/null +++ b/lib/assets_manager/views/assets_loading_page.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:pinball/assets_manager/assets_manager.dart'; +import 'package:pinball/l10n/l10n.dart'; +import 'package:pinball_ui/pinball_ui.dart'; + +/// {@template assets_loading_page} +/// Widget used to indicate the loading progress of the different assets used +/// in the game +/// {@endtemplate} +class AssetsLoadingPage extends StatelessWidget { + /// {@macro assets_loading_page} + const AssetsLoadingPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + final headline1 = Theme.of(context).textTheme.headline1; + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + l10n.ioPinball, + style: headline1!.copyWith(fontSize: 80), + textAlign: TextAlign.center, + ), + const SizedBox(height: 40), + AnimatedEllipsisText( + l10n.loading, + style: headline1, + ), + const SizedBox(height: 40), + FractionallySizedBox( + widthFactor: 0.8, + child: BlocBuilder( + builder: (context, state) { + return PinballLoadingIndicator(value: state.progress); + }, + ), + ), + ], + ), + ); + } +} diff --git a/lib/assets_manager/views/views.dart b/lib/assets_manager/views/views.dart new file mode 100644 index 00000000..8c60627f --- /dev/null +++ b/lib/assets_manager/views/views.dart @@ -0,0 +1 @@ +export 'assets_loading_page.dart'; diff --git a/lib/game/game.dart b/lib/game/game.dart index 7de964eb..ad02533d 100644 --- a/lib/game/game.dart +++ b/lib/game/game.dart @@ -1,4 +1,3 @@ -export 'assets_manager/cubit/assets_manager_cubit.dart'; export 'bloc/game_bloc.dart'; export 'components/components.dart'; export 'game_assets.dart'; diff --git a/lib/game/view/pinball_game_page.dart b/lib/game/view/pinball_game_page.dart index 9ac25cfe..4557c243 100644 --- a/lib/game/view/pinball_game_page.dart +++ b/lib/game/view/pinball_game_page.dart @@ -4,10 +4,12 @@ import 'package:flame/game.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:pinball/assets_manager/assets_manager.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/start_game/start_game.dart'; import 'package:pinball_audio/pinball_audio.dart'; +import 'package:pinball_ui/pinball_ui.dart'; class PinballGamePage extends StatelessWidget { const PinballGamePage({ @@ -71,32 +73,13 @@ class PinballGameView extends StatelessWidget { final isLoading = context.select( (AssetsManagerCubit bloc) => bloc.state.progress != 1, ); - - return Scaffold( - backgroundColor: Colors.blue, - body: isLoading - ? const _PinballGameLoadingView() - : PinballGameLoadedView(game: game), - ); - } -} - -class _PinballGameLoadingView extends StatelessWidget { - const _PinballGameLoadingView({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - final loadingProgress = context.select( - (AssetsManagerCubit bloc) => bloc.state.progress, - ); - - return Padding( - padding: const EdgeInsets.all(24), - child: Center( - child: LinearProgressIndicator( - color: Colors.white, - value: loadingProgress, - ), + return Container( + decoration: const CrtBackground(), + child: Scaffold( + backgroundColor: PinballColors.transparent, + body: isLoading + ? const AssetsLoadingPage() + : PinballGameLoadedView(game: game), ), ); } diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index 162b0d19..5566066f 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -123,5 +123,13 @@ "footerGoogleIOText": "Google I/O", "@footerGoogleIOText": { "description": "Text shown on the footer which mentions Google I/O" + }, + "loading": "Loading", + "@loading": { + "description": "Text shown to indicate loading times" + }, + "ioPinball": "I/O Pinball", + "@ioPinball": { + "description": "I/O Pinball - Name of the game" } } diff --git a/packages/pinball_ui/lib/src/theme/pinball_colors.dart b/packages/pinball_ui/lib/src/theme/pinball_colors.dart index 5db27229..df1ddce6 100644 --- a/packages/pinball_ui/lib/src/theme/pinball_colors.dart +++ b/packages/pinball_ui/lib/src/theme/pinball_colors.dart @@ -8,4 +8,9 @@ abstract class PinballColors { static const Color orange = Color(0xFFE5AB05); static const Color blue = Color(0xFF4B94F6); static const Color transparent = Color(0x00000000); + static const Color loadingDarkRed = Color(0xFFE33B2D); + static const Color loadingLightRed = Color(0xFFEC5E2B); + static const Color loadingDarkBlue = Color(0xFF4087F8); + static const Color loadingLightBlue = Color(0xFF6CCAE4); + static const Color crtBackground = Color(0xFF274E54); } diff --git a/packages/pinball_ui/lib/src/widgets/animated_ellipsis_text.dart b/packages/pinball_ui/lib/src/widgets/animated_ellipsis_text.dart new file mode 100644 index 00000000..9b52d604 --- /dev/null +++ b/packages/pinball_ui/lib/src/widgets/animated_ellipsis_text.dart @@ -0,0 +1,61 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +/// {@tempalte animated_ellipsis_text} +/// Every 500 milliseconds, it will add a new `.` at the end of the given +/// [text]. Once 3 `.` have been added (e.g. `Loading...`), it will reset to +/// zero ellipsis and start over again. +/// {@endtemplate} +class AnimatedEllipsisText extends StatefulWidget { + /// {@macro animated_ellipsis_text} + const AnimatedEllipsisText( + this.text, { + Key? key, + this.style, + }) : super(key: key); + + /// The text that will be animated. + final String text; + + /// Optional [TextStyle] of the given [text]. + final TextStyle? style; + + @override + State createState() => _AnimatedEllipsisText(); +} + +class _AnimatedEllipsisText extends State + with SingleTickerProviderStateMixin { + late final Timer timer; + var _numberOfEllipsis = 0; + + @override + void initState() { + super.initState(); + timer = Timer.periodic(const Duration(milliseconds: 500), (_) { + setState(() { + _numberOfEllipsis++; + _numberOfEllipsis = _numberOfEllipsis % 4; + }); + }); + } + + @override + void dispose() { + if (timer.isActive) timer.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Text( + '${widget.text}${_numberOfEllipsis.toEllipsis()}', + style: widget.style, + ); + } +} + +extension on int { + String toEllipsis() => '.' * this; +} diff --git a/packages/pinball_ui/lib/src/widgets/crt_background.dart b/packages/pinball_ui/lib/src/widgets/crt_background.dart new file mode 100644 index 00000000..202af1d3 --- /dev/null +++ b/packages/pinball_ui/lib/src/widgets/crt_background.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:pinball_ui/pinball_ui.dart'; + +/// {@template crt_background} +/// [BoxDecoration] that provides a CRT-like background efffect. +/// {@endtemplate} +class CrtBackground extends BoxDecoration { + /// {@macro crt_background} + const CrtBackground() + : super( + gradient: const LinearGradient( + begin: Alignment(1, 0.015), + stops: [0.0, 0.5, 0.5, 1], + colors: [ + PinballColors.darkBlue, + PinballColors.darkBlue, + PinballColors.crtBackground, + PinballColors.crtBackground, + ], + tileMode: TileMode.repeated, + ), + ); +} diff --git a/packages/pinball_ui/lib/src/widgets/pinball_loading_indicator.dart b/packages/pinball_ui/lib/src/widgets/pinball_loading_indicator.dart new file mode 100644 index 00000000..ac9b4f46 --- /dev/null +++ b/packages/pinball_ui/lib/src/widgets/pinball_loading_indicator.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:pinball_ui/pinball_ui.dart'; + +/// {@template pinball_loading_indicator} +/// Pixel-art loading indicator +/// {@endtemplate} +class PinballLoadingIndicator extends StatelessWidget { + /// {@macro pinball_loading_indicator} + const PinballLoadingIndicator({ + Key? key, + required this.value, + }) : assert( + value >= 0.0 && value <= 1.0, + 'Progress must be between 0 and 1', + ), + super(key: key); + + /// Progress value + final double value; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _InnerIndicator(value: value, widthFactor: 0.95), + _InnerIndicator(value: value, widthFactor: 0.98), + _InnerIndicator(value: value), + _InnerIndicator(value: value), + _InnerIndicator(value: value, widthFactor: 0.98), + _InnerIndicator(value: value, widthFactor: 0.95) + ], + ); + } +} + +class _InnerIndicator extends StatelessWidget { + const _InnerIndicator({ + Key? key, + required this.value, + this.widthFactor = 1.0, + }) : super(key: key); + + final double value; + final double widthFactor; + + @override + Widget build(BuildContext context) { + return FractionallySizedBox( + widthFactor: widthFactor, + child: Column( + children: [ + LinearProgressIndicator( + backgroundColor: PinballColors.loadingDarkBlue, + color: PinballColors.loadingDarkRed, + value: value, + ), + LinearProgressIndicator( + backgroundColor: PinballColors.loadingLightBlue, + color: PinballColors.loadingLightRed, + value: value, + ), + ], + ), + ); + } +} diff --git a/packages/pinball_ui/lib/src/widgets/widgets.dart b/packages/pinball_ui/lib/src/widgets/widgets.dart index 34d952b6..3aa96c3e 100644 --- a/packages/pinball_ui/lib/src/widgets/widgets.dart +++ b/packages/pinball_ui/lib/src/widgets/widgets.dart @@ -1 +1,4 @@ +export 'animated_ellipsis_text.dart'; +export 'crt_background.dart'; export 'pinball_button.dart'; +export 'pinball_loading_indicator.dart'; diff --git a/packages/pinball_ui/test/src/theme/pinball_colors_test.dart b/packages/pinball_ui/test/src/theme/pinball_colors_test.dart index 36e45c0d..3c54c60b 100644 --- a/packages/pinball_ui/test/src/theme/pinball_colors_test.dart +++ b/packages/pinball_ui/test/src/theme/pinball_colors_test.dart @@ -27,5 +27,25 @@ void main() { test('transparent is 0x00000000', () { expect(PinballColors.transparent, const Color(0x00000000)); }); + + test('loadingDarkRed is 0xFFE33B2D', () { + expect(PinballColors.loadingDarkRed, const Color(0xFFE33B2D)); + }); + + test('loadingLightRed is 0xFFEC5E2B', () { + expect(PinballColors.loadingLightRed, const Color(0xFFEC5E2B)); + }); + + test('loadingDarkBlue is 0xFF4087F8', () { + expect(PinballColors.loadingDarkBlue, const Color(0xFF4087F8)); + }); + + test('loadingLightBlue is 0xFF6CCAE4', () { + expect(PinballColors.loadingLightBlue, const Color(0xFF6CCAE4)); + }); + + test('crtBackground is 0xFF274E54', () { + expect(PinballColors.crtBackground, const Color(0xFF274E54)); + }); }); } diff --git a/packages/pinball_ui/test/src/widgets/animated_ellipsis_text_test.dart b/packages/pinball_ui/test/src/widgets/animated_ellipsis_text_test.dart new file mode 100644 index 00000000..3800cfed --- /dev/null +++ b/packages/pinball_ui/test/src/widgets/animated_ellipsis_text_test.dart @@ -0,0 +1,30 @@ +// ignore_for_file: prefer_const_constructors + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_ui/pinball_ui.dart'; + +void main() { + group('AnimatedEllipsisText', () { + testWidgets( + 'adds a new `.` every 500ms and ' + 'resets back to zero after adding 3', (tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: AnimatedEllipsisText('test'), + ), + ), + ); + expect(find.text('test'), findsOneWidget); + await tester.pump(const Duration(milliseconds: 600)); + expect(find.text('test.'), findsOneWidget); + await tester.pump(const Duration(milliseconds: 600)); + expect(find.text('test..'), findsOneWidget); + await tester.pump(const Duration(milliseconds: 600)); + expect(find.text('test...'), findsOneWidget); + await tester.pump(const Duration(milliseconds: 600)); + expect(find.text('test'), findsOneWidget); + }); + }); +} diff --git a/packages/pinball_ui/test/src/widgets/crt_background_test.dart b/packages/pinball_ui/test/src/widgets/crt_background_test.dart new file mode 100644 index 00000000..65f27456 --- /dev/null +++ b/packages/pinball_ui/test/src/widgets/crt_background_test.dart @@ -0,0 +1,25 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_ui/pinball_ui.dart'; + +void main() { + group('CrtBackground', () { + test('is a BoxDecoration with a LinearGradient', () { + // ignore: prefer_const_constructors + final crtBg = CrtBackground(); + const expectedGradient = LinearGradient( + begin: Alignment(1, 0.015), + stops: [0.0, 0.5, 0.5, 1], + colors: [ + PinballColors.darkBlue, + PinballColors.darkBlue, + PinballColors.crtBackground, + PinballColors.crtBackground, + ], + tileMode: TileMode.repeated, + ); + expect(crtBg, isA()); + expect(crtBg.gradient, expectedGradient); + }); + }); +} diff --git a/packages/pinball_ui/test/src/widgets/pinball_loading_indicator_test.dart b/packages/pinball_ui/test/src/widgets/pinball_loading_indicator_test.dart new file mode 100644 index 00000000..a2cc6d1a --- /dev/null +++ b/packages/pinball_ui/test/src/widgets/pinball_loading_indicator_test.dart @@ -0,0 +1,45 @@ +// ignore_for_file: prefer_const_constructors + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_ui/pinball_ui.dart'; + +void main() { + group('PinballLoadingIndicator', () { + group('assert value', () { + test('throws error if value <= 0.0', () { + expect( + () => PinballLoadingIndicator(value: -0.5), + throwsA(isA()), + ); + }); + + test('throws error if value >= 1.0', () { + expect( + () => PinballLoadingIndicator(value: 1.5), + throwsA(isA()), + ); + }); + }); + + testWidgets( + 'renders 12 LinearProgressIndicators and ' + '6 FractionallySizedBox to indicate progress', (tester) async { + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: PinballLoadingIndicator(value: 0.75), + ), + ), + ); + expect(find.byType(FractionallySizedBox), findsNWidgets(6)); + expect(find.byType(LinearProgressIndicator), findsNWidgets(12)); + final progressIndicators = tester.widgetList( + find.byType(LinearProgressIndicator), + ); + for (final i in progressIndicators) { + expect(i.value, 0.75); + } + }); + }); +} diff --git a/test/game/assets_manager/cubit/assets_manager_cubit_test.dart b/test/assets_manager/cubit/assets_manager_cubit_test.dart similarity index 93% rename from test/game/assets_manager/cubit/assets_manager_cubit_test.dart rename to test/assets_manager/cubit/assets_manager_cubit_test.dart index d0afee34..27d9cedb 100644 --- a/test/game/assets_manager/cubit/assets_manager_cubit_test.dart +++ b/test/assets_manager/cubit/assets_manager_cubit_test.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:bloc_test/bloc_test.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:pinball/game/game.dart'; +import 'package:pinball/assets_manager/assets_manager.dart'; void main() { group('AssetsManagerCubit', () { diff --git a/test/game/assets_manager/cubit/assets_manager_state_test.dart b/test/assets_manager/cubit/assets_manager_state_test.dart similarity index 98% rename from test/game/assets_manager/cubit/assets_manager_state_test.dart rename to test/assets_manager/cubit/assets_manager_state_test.dart index 12a42485..4882f880 100644 --- a/test/game/assets_manager/cubit/assets_manager_state_test.dart +++ b/test/assets_manager/cubit/assets_manager_state_test.dart @@ -1,7 +1,7 @@ // ignore_for_file: prefer_const_constructors import 'package:flutter_test/flutter_test.dart'; -import 'package:pinball/game/game.dart'; +import 'package:pinball/assets_manager/assets_manager.dart'; void main() { group('AssetsManagerState', () { diff --git a/test/assets_manager/views/assets_loading_page_test.dart b/test/assets_manager/views/assets_loading_page_test.dart new file mode 100644 index 00000000..a6210e0c --- /dev/null +++ b/test/assets_manager/views/assets_loading_page_test.dart @@ -0,0 +1,38 @@ +import 'package:bloc_test/bloc_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:pinball/assets_manager/assets_manager.dart'; +import 'package:pinball_ui/pinball_ui.dart'; + +import '../../helpers/helpers.dart'; + +class _MockAssetsManagerCubit extends Mock implements AssetsManagerCubit {} + +void main() { + late AssetsManagerCubit assetsManagerCubit; + + setUp(() { + final initialAssetsState = AssetsManagerState( + loadables: [Future.value()], + loaded: const [], + ); + assetsManagerCubit = _MockAssetsManagerCubit(); + whenListen( + assetsManagerCubit, + Stream.value(initialAssetsState), + initialState: initialAssetsState, + ); + }); + + group('AssetsLoadingPage', () { + testWidgets('renders an animated text and a pinball loading indicator', + (tester) async { + await tester.pumpApp( + const AssetsLoadingPage(), + assetsManagerCubit: assetsManagerCubit, + ); + expect(find.byType(AnimatedEllipsisText), findsOneWidget); + expect(find.byType(PinballLoadingIndicator), findsOneWidget); + }); + }); +} diff --git a/test/game/view/pinball_game_page_test.dart b/test/game/view/pinball_game_page_test.dart index d3b32d85..0ed6e744 100644 --- a/test/game/view/pinball_game_page_test.dart +++ b/test/game/view/pinball_game_page_test.dart @@ -5,6 +5,7 @@ import 'package:flame/game.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; +import 'package:pinball/assets_manager/assets_manager.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball/select_character/select_character.dart'; import 'package:pinball/start_game/start_game.dart'; @@ -66,7 +67,6 @@ void main() { Stream.value(initialAssetsState), initialState: initialAssetsState, ); - await tester.pumpApp( PinballGameView( game: game, @@ -74,14 +74,7 @@ void main() { assetsManagerCubit: assetsManagerCubit, characterThemeCubit: characterThemeCubit, ); - - expect( - find.byWidgetPredicate( - (widget) => - widget is LinearProgressIndicator && widget.value == 0.0, - ), - findsOneWidget, - ); + expect(find.byType(AssetsLoadingPage), findsOneWidget); }, ); diff --git a/test/helpers/pump_app.dart b/test/helpers/pump_app.dart index 7347989d..8c852f4e 100644 --- a/test/helpers/pump_app.dart +++ b/test/helpers/pump_app.dart @@ -12,6 +12,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:leaderboard_repository/leaderboard_repository.dart'; import 'package:mocktail/mocktail.dart'; +import 'package:pinball/assets_manager/assets_manager.dart'; import 'package:pinball/game/game.dart'; import 'package:pinball/l10n/l10n.dart'; import 'package:pinball/select_character/select_character.dart'; From 62be5f636d23b477aa83f152de036244bc6b1df0 Mon Sep 17 00:00:00 2001 From: Erick Date: Tue, 3 May 2022 13:36:02 -0300 Subject: [PATCH 03/10] feat: adding start screen sfx (#308) * feat: adding start screen sfx * fix: lint * fix: lint * feat: PR suggestions * fix: lint * Apply suggestions from code review Co-authored-by: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> Co-authored-by: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> --- .../widgets/how_to_play_dialog.dart | 7 ++++- .../assets/sfx/io_pinball_voice_over.mp3 | Bin 0 -> 55308 bytes .../pinball_audio/lib/gen/assets.gen.dart | 1 + .../pinball_audio/lib/src/pinball_audio.dart | 6 ++++ .../test/src/pinball_audio_test.dart | 18 +++++++++++ test/how_to_play/how_to_play_dialog_test.dart | 28 ++++++++++++++++++ 6 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 packages/pinball_audio/assets/sfx/io_pinball_voice_over.mp3 diff --git a/lib/how_to_play/widgets/how_to_play_dialog.dart b/lib/how_to_play/widgets/how_to_play_dialog.dart index 3dc2c62b..e91698f5 100644 --- a/lib/how_to_play/widgets/how_to_play_dialog.dart +++ b/lib/how_to_play/widgets/how_to_play_dialog.dart @@ -3,8 +3,10 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:pinball/gen/gen.dart'; import 'package:pinball/l10n/l10n.dart'; +import 'package:pinball_audio/pinball_audio.dart'; import 'package:pinball_ui/pinball_ui.dart'; import 'package:platform_helper/platform_helper.dart'; @@ -50,10 +52,13 @@ extension on Control { } Future showHowToPlayDialog(BuildContext context) { + final audio = context.read(); return showDialog( context: context, builder: (_) => HowToPlayDialog(), - ); + ).then((_) { + audio.ioPinballVoiceOver(); + }); } class HowToPlayDialog extends StatefulWidget { diff --git a/packages/pinball_audio/assets/sfx/io_pinball_voice_over.mp3 b/packages/pinball_audio/assets/sfx/io_pinball_voice_over.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7829086c476ecf2b6ea5a0f2e130eafc089f6dc7 GIT binary patch literal 55308 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 z zUeP{Eg=krY{l0o>*d_aIhXH=znVVtb>x<^?EyOLyugw z1_EoQhai{WWk*L#CavwW@s@&BU)`t6_o6@#gfgUzY&v83zSu)G)dBB_`YHQT8o1t?#wtmY2n>x}Qt4&yZkEPdQ|)%rwrW_m8$`nPQbL|#d ze6E0n!w0VTju(KpIwZg~MyC`IkM{BU8-riT@-v1F%N7Z2c2zcXpE|do%v&MIAO%Wq z(Pfi#Aa#jU-=p=a$2Vu^JtTYw4D})6u5Eu+?kMWq(qYUh_rEb#ZkteUs?U5e|K72_ zzPqv!48<74G2HSKE>DXlUYewS8o6d!qi)tOWo1m?(zw*qHgCOuAeXi4wOCWT+}keu z!+A{Lsr8gD6g=dCsj=B4IT7mZ|M8YLo;4EicWoT-s^cTU5@p!+$5+O$dHJ^h$v5t zUQQ_XX5zh}oQG=~3xTU~K`&pBIVV#9e3zEH6=Gt5!q~u7IZo#hGkmRC>%Exj5}zRh zXPtmTq2%t1l7e>VtZ_3>ebLo)GX_tZ8(tft+tO~Ex3`QlzHN8vJFEprgv=&$^FPV% zpr<~1+P-`|c3l7`s$*6(DYxh=;Lx`D=lomzsiCXLeazHviHLcP_YT<&I~g(?lZ3R` z7*20vZO*3|r+VCnqkP%FL)_bcglaR1SH$U!ibYc>2-7mG{=`7wMi6+d@U@$tS=?{r z(zr2;-pFZ`%;k>CnUdiE9F2gkB~Ay)?rKELFH!ohbRS}-DqSH?F*^vvnl{j-{_KfMx}EoFl#TB9uB_(4Cs|!< zTYm=aR?kAWn~t8_8QazV*N6Up2wwf)y#)YTz5%pJ=0D`UEVvW0o*k!MK3lm-mIE+J zQv|u4ZOu(y# zP8F=q7SdhY<2Lyv%D)-Ac~du;u@ugeXgeGumO1kMEtzqO{XuXf1j?$hD(mzl#ojB> zT`Tf1(crZcyV{XoP*a)d$n!Z8Z!bd!1ydPy&&TEUQygc_*p9)VdQ)XbgPvTC!(aY< z?TJymCiv$-$){L6$P%6!7}j_=0PkY*P0q>FFL}F;1k`#jsc;EpP(snn|Pz8uE$Y`I6Q>2e?<` zP0XqG;$3)ABDr|}&?j<5Bt9yO*oLRrIE`}}?UhK2d%nJS`;$dVrwCavHQ==YT2TXH z@^(3&SH;vGVTjRC!>{ppSk{`LllaBj5jYH6{RHPbx}8+%!YrNsvoi8K_rJpjS>=uNr>> zmRluKf{smTjM3uls9am3qb=L`K z36=yI(obd0mGsT1J@-KXBCaA-slX_+;eZHCX6rSVS|99-RQJ1loNTZPvcR_Kn3fc* zOhnd;Qrw5i1?@+R@takn<=OkWU~NGOnI5yRBbT=f`fDG)uO(fXm;dB#H~jKGbM$BD zq;F@fp91d)oGnw&pGzwnWnPpQE`ZPc_ zNYu6tlD99Rk`lNLqTrPyuT%yV<8TB6zyPTDK$xgI$>1w+sRmq0!cK0(qvxtMNu=lO zuGpPKma%jnw+Z|%YYG9Fd&Y$slhxU|#O}H1aOy%>IeA#p4+o&Kcv?t0v=MBfD}V_D z#bN61QH|oIxa$>jrM_2omPa+?0Ys9aHf++to+w5_buuC znUf~nyWxKWUfiZ{kfK}vy<-hS-xM&pPuoXFQ8D@?Vn3^dmygznDRx4zOfD;7Xm_hW zNmfh0?KGgkx^`l;74`7&XW;!ibtG0I9<$Omx%v9WKR%Bdw;bEl5zBbKekX|Xq4-KC z8HxJDL`TV>An}>;D+y)>Wl5n-JH;bGL4UVG=|F2`}Q&=kil-j#?3vAG^`#-1J~QMro@w-D+8*G|q?W$8D3X7^MR=|j-o zHj32aCZ77lHs0Q2(k(eE4kF;2dcPfbjNzA5~<1;O@^L;O`d9VgHL=S`_xlCM;#G86$APHiYF z;Yb%wOpr#wPWuvDM~tDzOym(NipqV2F<%K#)ckPeXjC{!jzO{OvF1{>njb}}VzR25 zY!bpV%MsWqP;*H6r1}O?iYu605;`=!!jE~Vq{7py22pc;uo-nj8VlT(wDjm!0|*l{ z0x5DGNM)KO62S7~3CfTGd@K$s#VyDPhQo=WSX%1rIu9B%a;wN0aeI6z@IyK=m=tqm zbK?Sth-1qD0QECw6C;rq&n!4%Qx!lTO1jisOeiri(=4^9L1@Rb>#f9vY_ZB{Wq zx2uin{}H*h;4zd&--fU6CT--{tmADDsk6dan_(?D`(QK%j1{Irl(~sK3UPR(DCc(F z_Gs?OFT`j|f^d)h@Y$25Kf+l|e(9HY&gy>bTxz`{*YAv?lE>UJBI&ehc>6eX`SRz3 z&d0wBuTBd#?_>_nd%(&r>yuQBs70qf6(R=M_^~T36a4t9b%c7c36{X}yp^Yk1NP6z z({O8aVEkL8f8ZuCiqi%J2Vz?o1VPHr{T7GkdCJ|Ko7I3$WDYd>QllX!*xc#i2^LXf zBW|K+ePwg*ZKC2v?+c`g z)oS}#EB;O}Qsao`uvtjJxKZVJNAO%mvqpazdc;N5+evln)Hkl_-6hL&YXBE5Ws)@i zT(3hS1P!1EGX=j_LryUF9)GEpb%tKeFYe=lB>;f1j)XLPh5-IC1wWR?1!kzruqw?U zAZ#Cf07dnFt*S~;lIQA$0|5Xx$4H^7z7D-%PpfVedn}U(TRZLWdO{ue zArK?%VP%>i_X-w>v_Cnl8c9a7_ViwJIU0hHS}5a6?Yotg-8t(FrEJRMTDtZ?Fbn}f z*K-_CoWC!YA|(Vw!T_n2>4{JC8H63aY2`8c)ucu$_{aV7xgGr>!&h7QNhQ7qW6b^O zl}v-YQJznF%CryJMyilxnmgkegOEvipV#Z~4|3c#B??||uK#;__yzp% zBDiDv3sXp<>NBVH{$;y5DwlJE!DD*fF`Wua3rl_ z8xhr|iY*gBl$@)5WR$s6Xr4sJr66iTT!Xh)02`nB0hc>#8RXoYn_Jy#>pfPZds|4v z`RSy9cqPt$F)(o3VkKLfsSH_cs$lg%v*P~GtKk~}#vAr(b#y30)@cW2>0e1Ni6!Xa zK^ac69b}@|*d_oet7an9sT1A;HqIFG{}sYS9tA1I3K-?f5h^RbNQjP=&Q#^18D?ty ziv>fo$>_c67MD|HvXsMR)i+>N0>txl zTO#G#LHd3yl)-iV#rHpcqkI52P_2+iHxeYh9qeMkjDIf^8sO0I6p*Ozz}T~6d-gN0 zD9fR6En$#rY=NS3Q|%V`O&$8atap5!t~bvu&Vtgi==$5wS(-I7FZA}y=PiQW1R*T8l&?dJLseH5u!vl))~bS>Bw{)?nMGF=~pxelp1+q zzQ_AO)5|7;9?bBPjXx?Znx*!OgU(Ou$!j%;aTUODOxz2roTx0P6lG{>U@V2=7#kh4 zXXT74eVk#IDeE?pz|s9k1St(EXO2$QyLBh#Hfb?%V;Sn~?=PZMV6Vi>J80gN2N8eO zuz|jr5=tRZ3KBQ`<pW0e78X$?GBfgB((^MB#A#5c7}9y$x~lB$E|j(}SWL z-?8W&{a9&kWlzfNPqZwEY1t0Vg2@0Ly1n*))S-0d6F2eQVjgCCRgU{o4 z4gKAPZT;!)Q@44ow~WGOXS2@m6?)%}Bbh=6lEv%aSLU8ka1VbXQAg4Z17H`-Dv9# z-6ZW@xAN1a5rM5Yf*IP*PiN<5+05)j?(L)zWY( zz>Bf3ljN2elHz5=69`cSFdq9br9xienpnmsy_`hMPa}&ktld|ZB*^F+3RY4$0y$6w zMOgG*FcwGxunx@$1wLRtcY!c`0t*Egkmnm-)fMeZ8-ieTDDLY_gV1v0vc|-b=o>dF zG@MF%bNkq?z0vyf{2^0BXO0(kTN7yO($YrLB!NKI17F`{=EZ)ir1y%SYZi>x9pZ1) zE|Xs0DcSV+t8(W_=S3b9`FSI-e~=RZz7nLquS)t4az;UKJ$97;jBHu#MLT%gX{?m# zo2jm98TfBVBS#W~AUK6sdy5B+X5U5UO5T3L3EK=AQ3?#0%E(qM=(%o;(!_s@zFniq zu=%>3XNf1T^Rvx`N5KMX*UE$6N5>1&`;Koq?cwGduXnOxwm5JKfY{J<1g)~#B!3Le z;DDIvI?#wecN%i=sbC$%rK>y{t0yBxlYyv->}D5~0j+F+;!QPVk%+J{c-y&JkG7VL zajBvVTBGKaeqt)ggZEH-vaK=|wp|r>N3Op)M!~bF{D|bS-M*?H+77amkqUYbu}mFz zAx@N~mP{H`LU?+|JEcyTW=afJ`d-iuKSUb^wzWL^7VKI3awE}nDVz(Xl+Rh~hD^{f z^Bi%0>)ax2_jbBLxRb7QBwxt=o7zWIPsR(~<`70QhUGEm{>0u^l$6_&nbeuL&5xbv z{S_5j29~c+f8!Dx40`NIN3zYkX-@~b4K~!U%V@$f-u!I}|5!J!&lkJdQ_fGCBgzy> zm}ToO11KVCPIM^n5e5LTJSkIQhHxM$5@rs@5z7lytMtXhfh>5~&4fHZ^k^{niX=m} zq5J5S z1a$t(al+Vo=wFrN34Je0we@xAALNAIvVH%!BBh&50c%aXxe{_Ks(3=cz4vyv@0_#S zkWCl{LqZ{u!EkeiTJJtL4@N;*XX6^FL&h1;{z-$vD#xD}zcIm#<7cL?(%;>>th;Nq z@KyWqmxF{W>xW;S<8MdV%i%B8jG2LgPcKm6($*;f!bu$Tgh!m8sv5vzU~nA4mwsAzfpjX55|X<)^faDV6Z4xsN2>VR%h% z&W9GV1{xwuR^uAwb~*;tI3q4LXkQEs2|c^>fEWjy2&CgSMW2faAhD(jA%gmbGopDc zhWxR{==DgGtvx7}O2C6`1GsP>1-lvSW|J`D*L}P5;PqJP5klGM)=u%=_p7F@Al*9J zQNyboK!-El>!Ubnl8I!hfETy7glK*^?{<63x7gn)^ELj`bXmNkzP~_^eHKgw`kHa2 zx7I~xoD7DGcS`?b%CemFIC zi)Y%QHR!uaFmX}Btr?&i;RGa#qht)_C>g;=MoW&@#i_-?JQ)q{4Jff1XxyQKV9tO0 zH%05vs%4|8rKS)y!>kBKJpb(UweUQ-I`MwN#sQ75x9Go#KZS}*|3&U=@{hQ{QKAz27+N(^@F(8@y*I-)sqSPbMh9%y8cPqz6i_moX}ImJtQ}%C;(0W@ z>HE`rw#xI(a5F9Lp{-9H%op##A32^16!nLJK3;9YR;G7ms zn>x{k)8Un*Y9p02ugE~GB~pNmr;;LI;Hm-S!#D)YsFhW=O!72?M~*xfu#R`@p&@5& z0gT{3KwO;#=EIm1waUEddJg1h&ZJsLC4Su(s1RQN>NRIC&BXFeku0xOKTG<{z>eIX z%gcdJr;+d8Fg*T9f3nv9?;hSOSNs z?M}c;PamsTIlfdK-NnjD;jNka@*iKVMsp7`$r4XC5nNQX!m?kM9Jzq9xc%VQWu#K9 z=*2yWF?wlgYc#Ayb~H^AFmr34O-iO-jzI@KRfDR3jM_C28K!X|z3Pof5?Azs^k4=m z!~opXEj5@1A72owMZh#LuAN^Q9otH*k{k}KHGyQ&NRnyNq-YdF1mDxZesw^QiU!K$ zO5FsC5Zf}T0aq)U%BgM=%_(}xcTj?eVfZBdE)3Q6#U4=CjbIyTXSSC4Nbr6j<~060 z8v5DdQI@42jB3{Crxn;h^{$eD+{^8qkES9!v~M>4B6m!E-s^aUT<_Jx+kXOH+=fs2 zuT<_z^!{^VW!HT2%2_G(c#W?}T&8?~-(OJn*^3aPCzMf2yE@@$_DF^g&v?NRM|>r| zgqzB*_F^-P?#bWnFnpbM?Ndw^^I`$qu666zZ=)3F#GH#KmzUoreyfLIAxAx!A3uZ+iP_-E|H@zExSir>uGGpw)E6ZaAT zm^wc#=n$Zj$16W6HWwFg7+1k?(; zpB(asl9p6uj?`&)L&$pA2f~fQ#(@BNP%{5q5|QkB@l%yROckmZM}({}Gdr8xk(qai zpJj6+r_T^&S^4Q)XjZ9PAS_bXC9Ad|;x(wzaqD@%)a9xa+3E05eSGx3RIfOqo7w=8 zsYjW(^Ob{_Kg@rCb6i|YfkwxvzKf25$Pnpn@amy!CF^qL)6CD;TDz_Eo8J^kzrU56 zn3*poz5|g^e?18G9Ujd6jqfENW?y19C=%!=a}d=hq8=`L;LQ` zefiz{{KNjZfmCGgv46Ls3^^^XJsAX6pEev59LC@j)e=%tx2si60C)(yh#w|6Gm|Si z!cCaQoWaJ@oYbil*{zIB{4LR=q&=1;%6}h8uLjatmUfi&%_hZJ(~7Q9=sIn04rPOw)rh(_5Ci!g{?Tv{LQ zB#y<}yjr<#L5Msw)1!@tO#Q=j)aT?M=z9RG{lQZhfo3J!3ET-cQ< zcx2^f$n*KE&w1?v1xXkY1}hUD+>uUg6Kz_CJetYO`OsE4_UPXF+dv_mUo!fi*b20y zbP<_q6*3BisUtO9q0i_cVc{w7YQ@7h?{7zxxnIS1fiQp?0ESlL;9|zaqf=oi8UyeJ z=yYyz6+)7&rkGhFUm~(QY#oR2hId9|0XYvMHJUhcMI&j#cDdnxS7lQMozuFF0miaB zXI!fv2nGb2P)Qy^fha9wVgQ4=n*T%wE$^I#0V>ZCN(5#C%Q6<*_g2-~luQjE)XT1N zK?oV%XaE;Y;1~^I6Od8THyjbqD}f6eG+r#uDN~kF5nv-DrI6McDNTT*?ro?gVAHtE zONxXkNwYM0q~usa0X-J=6&-U)iY?jPmvysFv0Jlfw>s44n}$ zI%5L(q**9?_KtgzACsV)eYPZxwt! zAu{9ZoTYFYI(mQ~iW@`(Ffc^`dTFP4QS`t-cflY|((ZyU<+N9u3Zxh507@M=KmJr_ z5>v)ZR#F{Qe}<}2tO8lM%7UFB^Vk|Ca~LzbFhCQHErIf8NWw{XIqX%CGZ|y9#cpjL zM%x@Qf%su4;xBTSI0_N};fV*Bt8e)qA3ASMu5j)r+||ebthQloa^0rE&-1qOBZAp< z0vHcU$UPdQ_thll*<3~ee`ZnDH#@|+mu#2g8Be4=j!xX+FD z@9Z36mMj*2>EDFc*tggWcSziRjb`Yv0lc1Cc`+oxbM+ga%#1Igk&)u5iP8)uD2s>E zpS)0tCDL~xQZXI3F2qps=V(wV)U z3AmAnbWU=eP(M%Q4p`Xy5`QeI4uuaat&NJnX{i1Me9w1{$QYcHN*~#+v;~mp2Y?-l z<}(*RAk`B4`=5xJOMYcFB-Kb6?^X_jtJ74|R0pK9O0g&-i#>i=3zXudDjog^i$MO{}7r(U!-=C%wEZ)~KBZS(^JFWvP1^4-6K%0_P6v`99q_ zpYG>%Q#lM)~wOBny-q9jNJ=tU$*007236F}$R&Z!%>8ydQ}Vz7jLb1vxm}Bac4?+o0l!dn zO6|aZOulY`MGmpJLWB(8n_E!6 zn^`Fe9B7JXmMx#$z^&4KlBsiOhsjx-QJragPs->b}Y%G>juh)uyiR1cCsMDoSCh$#qHsde_Pgi^~*In<5NQ@ zy4bgXQI67h#D0*`kVto_jVdB9Yu~Y55TJePEVJOI^%C2Bj;(HV$r#W{%56sGhe9AAkXz*Pns2*ee4K!21mhvR6l0B;XA?f!6X*&J75{vbsq zNpKWsN*wm`BO#YPh1h|Jbecy0zD;~7poB3`^F@sHIDx}f;5ZHX`W`3kCf2z??8N~l z9BeRuB2ociv;vF82E1KVrQxonB_v=~=?z>?#WuwkR)VawGhQ#`c}A`~`T0JV?UW#C z{~q}w&EwSUm*bZI4D)$?L{!tC!E06XJ9@cBiNO{s>TWY)!XnO4e=URM_8=}DCx20P zvu@h56MABrsYd_j_G>CHD9xsOlivr=&g7pyeRX($>x5CScFMCf5-?ou>j19s2ErZ!K^m|nGKx_2cYl>wH&H2eEczn-4Wo=LEHo3{tg0dlSOQE z;T3U8EVTfXN+KR0E(Na!UJVwF0pZv2tu9tiEwLphw{wyR*2fZVZ;K6znE>R}x#9*f zWl&w}s1~Le^JIUBqy#r<7I%+*wy-NjiDnp_EXIYRo)kgB5uy6@b>iG{acKU_LqS-ShC2!Hx%g2X>VQ}Gn=HQ#saMJXQco@Bmfj=x=$k` zIZ{06L}yBx=h7>bgmb*9+ZK^PB9;F4qT@&>!oRB1JNuuSq}tN zriR&HGqCs&1{`&%W}^*xZ(``u+iQUZ$+^*XS*MiHn750Z+_^=3k<67&M8?U-SW#N3 z$eg4vS_=eKW)YDvP<48bzKn40Ql>Fd?Gd!Dc(Ts}da7BSK*8#vnJyaPX#7E*)89zx zXaXC4s2Z)IM^}^yLPW&(BV`q)js{3EuK-3JN@=kRn{>z^#{57_8>X!B2~H2 zy{M(u{lw&a3mj8ikDxR94ut}c?8PJZrvnJKG&TSLiv-V?mnp`CH^=j8)VkPXjj$5d z_KSLsMHnZG7OX@QHrE7;co_`HUpHrt+W#~gL3a=H79nxHC!Ul1dffwk^|mCj5c}My z+=N(~Cj08rydI{+h3m)^LJaJ7!pSuTiYL^)-tkoTvfan<5Kw-_mGdj7$@fo1-3v1g zHR5BtKzZQ}4d#yOIbB7MmsuYybZfmP<%CxY-lpC$`s4QCbSEasa{e!Jd$=FB?`X~D z_KN@eEN4+6qIW?4ugVoUa^9*GJ~9ga8LT6xDZj4HX?|yIz z#G)C~va`+R>zrhKBj6pyf$v-+ALIq<(+lc?<}Vs$oT)b`5-D8@6x^*dc^y9r6kd{e z#}xYbc#+VoV9SxpQ%hGSITWF-8|O%yOR?$FgLp;C{uG82{Kg67mk%LEKwm1(=%8A$ zQo%LuG9oVPP+^lls6(~5XJCGVK0pqt6i_KozJMmig+q}rje9sXdbd<|$)K029m;-; z;{n-#;t>tYe|HP!^&L4O68iF+ zF&V4PV)5x(EU+{*1&zxj)Uh%Xb7VYqshm|Z@u{2i!% zM^yUb7B5Z9gJ_b%mu*!wLhF$}c5~_K}xD@$&oIG{tquct}NXK{qsvs9;Jj&UJ8BYkaCnW|D zgrOA1K&%cU$k8>E6gO=G(7JYeI^j7um>d?sL(l1!W5nmR>K;R%M!IQMbx-*t9;)B+ zNv!O6FwM3(>=xNv^cLtgeorkR#V*adar*3eWH-^nbx=#jN^3VSXh{rDjF}#34Ev=N zEAV@>D>AF~h%;!>+xLlO7Ib_tB%whhoPo*eJ=5A>;dq+#^f`W(0y z`O>5Ldcm<9(4JtD6d{SYmZ`$a54I>Ov*7pf;pSxpm9``icQc?(bvadKh$`s|MS#QP zv<2SyGB{$4xTt9 zzpvfVW9t1)XV1c$ndH~2!y2t-&dgsQO#J)Nh0dENy+yI#tjsu7X02|7ah+Y-tzUdF zrdgan^6y8}@`xmS4!#VYD3z}eXt27U^|iO)Ck!S?3FkIvW}ktdhQjx?az+waw6fs3 zTdb#Q`2_uZ*T5$q?;{ebS%W%rf~>gjXCB55NiQa>NPaQpnA83^Q~*QS+%$3-3yEQ5wl0%6?L?7 z-S}yHrPVpb7i@{W)aSMBN9sh1ijt+O_OGU(W=+fL)qirIAJ=m^mdcTB)5e1T*P9>!03-mAaAjVNR^FlJ&aJN|zs))>@AHjgOQP~y51hF2k&-}x zkXi*BLZeSmR$`Z*pI0@**Z@2qy(REzxy|gtsPkPnRtiU-gqKDhgcylB zEX0q!-(8VaGpbQ~=6aP8wJvpcz|D2o1}@dN`RA@Q{3?27R>&(RT60nigp|TUJ-Sr1 z1RvJy9NK>V{KIkMnOF|{+(sONM>Cl^Y0W)fzrFrlj2@56;X!q7ZQq-U#%h)CG&B)d za_T4s!fOqNN>sNr7D^w*U+U>FB+M({z3bXRK0xkBZa+k-##Y>i-IRtP2}<@4$p*-g za3GLo3Q7b($q+A+AJgDi)a@rN3#*7UEIkQ|DEGoZqrFi+rid9^W%uQm^ze>eRSXO+ zLJ0AW-%S=}Rx?6>_bVL@U@+p3i8t)gu5@Tfd#9y)Xx9Hsi;;6QT}cFW@usbLC{w3y zuH-p8lNHRBEN**0B>S?6eH$T*$5w1ywUjsyuWO z*RY_aXFRx&T~ZZiG(@B|>lOuE%$GhdAZ0wHzxbcp<^CV%R0G(#K#J)?Y8&WSkV7>= z@q7$TI(eEivjpAZNSI9N8;l%sa=UILg!U;%J){zz^5M2G24Q_fxIBau?6L;7-b_+!nQh!RaVJUr2V=)RM2c6ZH})M8jI=_tL}+9|5=ltccOIn?i%Ti0#}^j#ds*u;zBaXI9MfB)deG+3 zm`Sqt3zjYo+sP@?o3S>A0L2_fR*tI)m~bpRw;H$NBS#H}ZF#3D&vH9n zVQ{rGJ9T9sr=I|h} zP^5nwU(j~966#4d!v+wPJFy%+u;MRs%AJCY91EVom;;fwYh2PhkjLF7;?xjwCwf?j zI>bDwx0f@Bhs!@5JN2p0xWyDH>z{!%PQV>k2z?V{GV0sv@QwoFN;}_`CU>D8N+(dp z^f>{6$XFU+s-vP(^>9=cxAXbz^!8umwy4ftxen8H==`@Yhkg$ib4LG*TwQs`a-9_h zm4NHad>@lbPo`YjEZSYKZ6?0gv8}vE9>gzk*X1Xxuol0TVWd~P^!OZ$$3`qgtGqF- zUhu7U*7BE)Et(S>no1~3so1Uc|Nj<^03cjMm|h-}bmBPWYf<5reZ6EFT>NZAKZg9Y zK7FMzNM}$^zoj2eKGlapeS!eNj)1R6Z&;r%343hgJqJEfiy9FhD18@x!4+66Q!eM? zTh>J-X%cv+6y10lVOwiwYJFqU;iXNR&pkhNwZ3Jmmp?^Sx1U)kd5cRDl>JBb21%b2 z9ICmrpx$bt()WReqo~f0T8a~8xbK8xN#pNR+`?aC?e$9})EW4<3%}prdgM9VWl@y> zj(LRl^~140t4+Yz}*rTW}dK7mSS(h9wJU`yz!O$7<&qdNk|wcPvc z+Y45^-?Thm8dnwmlob*rbR;U66>C3lt-DrVZ~4YwK6q>zsrG!?iu?k{W>HYogg;p|;|$H)kzF zP!%~A7a%K zqo_`)yeCP+srBJ`-n|>Ib)(%=cFp9Sgfx)RlFVD<{cTpgE&_b&&xyYfvvIRoUrpxS zoXXi$XYS4*E9OkLeCW+`y~58##QXw!!==h^uPQvjTjdfzb%}5~cig<`qQaABe@yGbg%M@dh$1f$q$k?|A{noKE~P}LetuSKX{Q&ENa6(p znC~{x6cMl2OJR2)i;$Vk*qAFlUHOR_(--?btSYVIHO2lqKafo+%IKM^IY|p7AdMb= zgH%1jPlL$zDGd^b&AvygCNsPcTZ$SgAtwKwiv`AlaTq015z<#LOAq^P^Ll1_+<|rqI!!78eU0lFoLt-(xU&1*Ek=s$e_p=)r968tTT6~u`FCqqdtK}}5Gt9}&^EfE-OrboPZTy?3^&|2@w3TG@Bb8NY!uG;B7J

lcDmf8UcvTn%Y!9QKN#@YcAt8>)0vHiD>6I3{@Rtih9UL^prG>yEoOShRTIX&a zR$8uGBK#bk~@GDB6*&IOChRtu6 zy8lIPh3c%pejvV6^7}u?aVAdFif(;g{O3_Fc=NHk&@B3NP}Is%^--PJ!J*(CEt1dc z4&0yb1|M46o=v`-YCNN}(0~47;MJq{CpMPvo&+zrz5KIX^d{uT_kpjWMsM~z8?P6> zJDRSoh(`S{s2qxqCLGSeB<{xB%J9Vk%}DJ?i_}8Zl5PY?G)qvT2%Ks;8gy>q_=h<~ zIK!xF79a*maODQ!P}pZMd!pWk)NAO9YvA`0BqT2Vr0H|{c$~EZ527uxpA5Ny?&JtZ z3I_#f_p(j!Uoa3WQ)Kd(tlEkbLmk)cdA0&6oVhh%KE?f*vM_?dD$yLh3?abqQxpy` zlmdi_r}$@(!GS}1qNm_*lu8H@&?lYBwAbv;;WzHNkECNf>4|AG$v!_lq?Z?-cS3Qy?H-{SoS@|As zuCLVw1e7KL|E$fXsL?TC9eX)ia&fYn&PL4f(k;r(-@G>iM)WR5YzAL zF*xFQX8Ub<#HENs949}&xk*qn7cwaBLy9qiI|CRldIL7c&K?I9rJ^DQLrA4$hM{6T zpfNZrZV^PqoM~S+_OVsrR6`bL?nVTQL~WY9a)n%3G$%_$;raOP)5;>_2lTPn6k1Xm zy1}6TI5hXE&Sh;?h?f6*VC9Nzr4n;X{uepX`5d1hl#;NB-0g$7q&6eDnte$y&3JA1P;I|Q6Q_Eq4% zM4Ze1{{nLVsi^>fiD&O|U$^4_Xzx6`nq0qipM(Gj2@pa82{rT%p$Z5XlF*BxNCy)- z2rjySilIsgy#*=Kr7C?PHhK+86H(D6MFi|3E^t{6?(ui+ea3llKEOFI^Njmd#&68$ znb(~6bzOMQMtJB%9s-#!gz2($5%;U|wx#fkN!#%9DvlDSm45zD0=g=07;?1>yTQ0Zs=sXTS-$z=G$I#!ZCLymZja0 znYs#1nt(1u=&bjfks3JcQ^)22J%}-HsLMy&7v_n$g7)szuxCyl)rFD|x!5m6d$0O_ ztQh?n)fQ;ej1Iq`p2|qpJ^TGtU%3OUaa_tZb09qZt7t+{V^i3};M6nx5m9x=ixtOv zQRert1#t;~WW|5?e)`vg>z&!BA0f|P>C@ah+4Anw#n*A;+6aB<@yMIk9KSS~On`w$ z?$CDQCcr+L4$%|>Dxev0$XX@k_%97K;=JGZ#vdP-^1ULmKaMnxq1AG800xJZ*{Fc4 zLf|=_#4yK)dbJXy%FZN-P0sFgyi0B0u%@~#=~nRl2F3dU0@ixQ(1a_{3#rwKLy0wm zYL5Ugj_4e#siDa87gb zP_qi7gQtGXBZA>>p*2eV#*G+PewDJGt0l|Y=YJrd|3KV{kuVQ`#K*eF$B^TLmt#2D z*;abA<0w5{NeC|!b=oexF)_7~lDgNoFb}LDM{ShcqpFOa6!4wJ#7|f>0@#d6h)&0X zHN6?Ia<_=OLyApDbrP}R8k?*DJ%(!O4d%+uA-nCV_+WZ6<*b8->%EbjL~u@u0+(mN z+SAjvtAMvNl7DP&8m)>QKiB4b(W}Hn`LfHEaz!T_T;8+n0EH|AM)pn80#@YP#)s7x ze(BGumhXPGd}l|x5HDJ)&{Tgs3I@hW_gH0oi}A)?qB>%@BXE~<6iy& z`%Z+{Sr1Y?Su*BF9&Q(ghZ)orZCO6{bl-Zt#xVK2v=X;Qp*6(-F28ZC_XWQw5q~j4 z8wTPJsU9?d5UQQg^Mr*K;ljpp#5Lc%%MiS5Zyq5sXtY`U=FJQGn}VOsU#^gJvCC?1 z{!OuwN6Wwg(S^NV`lr?^ywbKt-69qXluEx(20A(2`4ZwJ1tm_RtOUe}y+dqajjg0$ zmVC)sa?RMhS--182UAg6&ntcYU2}Z0Q4vL=lKu8ClcLxI}5AKb-R=)>p>fb26!aHc+6TV=(5CC0oAZ9NO3h6%aetORy1k^jPog z$=2#+E`Q#$iC+n1H9wmTz-T>KWoPMwRu_u$tPL&N#;es>O5m_SM+S_rIT#{rOi-lC zgVMkdzhueLG>|-PeU0XW;=`z`BR2eXF$`D^b44jVcQ+p^h)?-2l?afQ4VK&ii!vu6 zc<`ht%Q1x+&JH9}=_Elj3zCqeN*VrfGQav<(mqNPPX|cS%ODmA2mpOniWXyyXD`R# zC&ASai%6K(t17|S>S;7cs2mOFG_NG*BPT}8S3VF#`h#nEoeggqG@-2i~oo5H)Ce4f1X%= zqdY=YW?jn&oYbv^yP4+=`=+o;(mKXhhinje#`g}3Jev1_y3b&YPEOLb zW~8agU{gMVH#HbSqqi9VeFiap=oFy5SIXL(m1XrGSu}MTYTfgdZuAC-`oQL^@nakg z+Uz45VaP&V0cfS(HF()V@7q(;ZN~D(R)yO20jBg!anx` zkK{ z1z_s9s6~~mbkCF|d=o^ThLy43VDt|#8ERs8eW{^m>1Aa6M0;7VsHdi4dxV96d^Zx| z!w@hf)JXaS9%~few3d?I<6iXFICf0a&KaUf_a1@2IM9M&lDVTO8Z>l5=fb)^RD(MTF1j~R3F885gkn8((;Qy>2~Ay+qO5aN!W{qg%N5^Ndcx|)ucqZEaWfb zKJk1#7DwQJV*PvgAj$m-#OwEOW*nM&Z_UBwUhk_{FCDKGS^2j<%{DI3V>5@cTpQ8K zkMTt}753Gm%wsIX%CrWobjnM-@L!kZzMQTP<+fnPzjT6s`Wv~cL*^V;M6n}##HuWmu7@jFj~@#4r0K9@V1B%M8biinQ5 zY8~7mL5CdakOF+C%WvQS!>?#c@Q$2Hv{kn^TEk#5o*-Z^ZUypEkTQ;)@KIKoq`wY}{*5YR-POj@|ok>yi9 zwMlD4AV(R3gjDN(s0RWq>9EG#(-SN1_Ch)IybkiN9VI*us&xQ2z=^9sguH=ecK-4; znK5>Vu^K#KypYZ=HBdl`US2@bBJs>1E1#n=f_`9Fnu0hcuCZU>`j^k%VuhNf?=^8H z$0@9WkTym|gt%RjUV1q~dz{Z$%Sx)ivPM#hs8~vDVK#P6cdDAL&LdGa_btS+Zob2z|vg zn>CdGZZ3xepvk9;-&8zxE1>CiBZBLGh<@z2vT-17m$=21#O1pR^M_HFX+~gEIH8tW z0^9=9g{VT{b-HX~HG)qDumJ>!;CX;iZIQMT>QmY^q8D*u;jZO&J>xVyEl~TFp%@oTIgwS^mZHxG0$NRF$7{@jZt*tKCQL zE)w_BS)($}Ez|P;{xYf?2dko!G445tk&t53F7EeN!W%z3?kHNQUo{t0VdR}BfAP1{ zT7b|jtO}}jO*OGXIyx6$7yeylxA9LF?wriL@{ZSNS$Ui7jD^LU!r=C(Vi^z|3c!!t z&afUd_Z=Lyv(6Zn9{+xvMP^4#CvaMul3AnmMeuKF$< zKUbq!U;?Fsttk@%U^|M$-~<-3!-0<1Pg_;Myj_LFxP7hlYyJ>Vjc`ZnL|6@8WnVS} zM1CwvAaFU)h)Bmp=C5C@*9$vu8Re=URT3)vL@#bZMYdQ8L8~(<208*Cmr93qBcggh zjJ+HCHHOE94_iOMmbxylpR~buOtoXZVb6JbPrB*JUoHCQ85>@~V<4DowdC>>IjNWr z=SuxonwRDZbIJ<}8HQqUkE|P3EvL0M_$}ebS(Sg?^|n4+k}w~CG2Sx5GRpGhXW@v) zoCE&eK6FsG)(9tc9)0AX$Rco>%sB?%;@HQq`6mF}^ zQ_>xqXbxahQCz0vBqPib4o?16<^JM1=#C&{J^oiDk!yePl{YB=H*)yFAs~aWKp{(V z0Vh38#M2ko-&%O9U&;Gyu-ta%WEfI0dDB=K%VXs{7;<3*wjcraxUO=m7gP`3a z>SvTRN=!}e-@X!nDjQ03d0fPUx$le)r2|Ta(KoljmH{vD`XhPVC=iDb`KX?|dAXox z)Q_aBp=2m1-ckGn9OnnO=(+`Mdrso*Z?c|I%0sujz~@`qXHLnrUXF6a&0 zyZT>e|K@jTAl7_}BhEr^?B%>lS+CSWYslkm!pkB45}%r+pXO5gAAP?3^{V5fwH7h( z(QQGv%y`~pg(@pLk-=rbVe9wptVfwYx9Jx@$DA$mx~)LG^p+UtI;{)A0eyj?J^^z8 zalX_d5P;se&}>Qsw|5MYYax)_Exg_ZKtQ%4K$)$e0vrTLnq2kX#LUY|Bh`Qv_uBP% zWZv0szUP3tWYn+9R(`2J+LzLcoC~K}q_C&ZQ>Dvg>>8dwg#jU|E+Q@ULkL?z={rmP z{n<;ukXy|?xDtON`H9u<;e*WV))8{KzmdB)hv@w@v-L1`g9}nh8Ia?BMf%trCX_OM zGMBvG_CDkn z6}N9iwfbCCOn!8>Grrg4Q+`A6_gdZKiFzY{%#Ynq5a~ueQxCPUo|!f~xU?M@@P}x( z_xx__*P>GOPz@a7C{>_PT~d=x5fQ6S5$A_VK=9d^5l#tdty%44xy~m1obm{Q@)tf` zCK-%Sz{?*6Dp7gxMr?Zk3I=Zs2H^l=Am2C+I%wHnz43e0odpy_nHR8lsEM(+b4#nW?o4xCW=}tIo;hs0WE8pk96q~RzxnAUN5jyqkVc=I`F2quMJPWa z1uxE3C@A$^^SwS{x5otcR0$9y!gkk@6Fi+0jf4nKzLTzFXT2Lf8UE8 zEL_q0-9E@a+dg>Ump}L)DLB&HYxE=!xo$?3$M4Wc+1Sj@F@@?H`y62Ov9dhsl&`u)*YndD_V1v%m3GBG~l1=UmSB2D?+!!KcXfq)7#!-~<*%=RDwq1u7-OTr%lYKSJTad4Pc$HU5#;Nzq*F19! zozJeamsx;v5mo^M`7-`cmH+f@YuR^y6_De;R< zGq%hY(_6IpkI~Au2{TVKR4>jxF-%~{YTG_u*!MTHKn`3u4_x2Rf2^d`DT(~yuigLI zV2>Mz`KP10@zImku)Z?d^jJWP|Ljft#@m6LTY1Z0ThLM|+XI)*Jy=FnE}y1+nl!?? z&hWyO&S-151S}2>waGGX_-k$y!BQ0%pk{I#0x{ITxI_`ox z5?jajvN<_~-251VJG#UyXqWlG5e@XAt*Z8_Cn>fIua*-5qjmkgcaiqkR$$ zof2m;es^_$a+gu2k|&wj^oda?uTp4ejU==wrMWqW3c9sq)Xb{SiBz63P$a%?Z6g7z&1sG?m9w4l9wk3Tj&B(`p`lsHC>a$ZNC=DxX8|nju&1$>X z)PsTC8c@IVSdW&sLqeFx!C=BQB`+U%oYsPLkHSba^kLbsnN;SOjkAoF8*$5HL_(0v zgwDNM5D#{FGHLeWppE(2Ivl|~tD%U5;niF+y81C*Wyz5vrm_M8y3P|hk32CK#6B6T zBO+3oitI$qP%qgUbe`r1!Oc4m$xy_mFmM#;BB))u88L36dT!|5^{Vcb5_19%n*8E zr>MkA9XpsK#+SIl!knVVB~OJgr&7x@sEK9Me0muX30S{M*9P1gW;#_NM{T9Syn6m!*t?b+T7&|6h zm~CkoaNe3Zb1HFoOFD8da69O@|MuoLKh^ZNHpnB zmR^ed`K88%UWmD)7{2+mgNbVU1wt&dT+GKsG3iH(Pa!@RoYAZb{p^bn) zfTiF+&s%HNS~(Mb3wJk~Vb9m5rK~ff4JI%qB_$<*AojOy~G%>zA`nabrpH z<6+U(hAjEv6j`_>XmgV4Vl6dCnXE(sZVHnV{nDKs~8(v4rxjJz4jmn)36v z73d11U&y`BIGl_(g#8cX%61QK_~rgaj&jHJ^k158VKv4Q+Zoqp6;iGC_eWWN68O+GbcMyye8OpYUzW0(N)ubGlWiGo)^F4x2+u^p&=*aiBeWkp-mR-u3NJQ zdf7z>v_2}9k1Dl#b3#YiVD^chr$w>tF8O4;r0YwBCdk}MwfJON9Nw0b#HpdJeu=kE zm=LF>B)h1YpQ7_Ve!DV*c!pS!?xGc#BGP%PLTC5eaUORyC{oNi z-!>^WTq3y{P$dN)tVPh3;ppyf(CUZu&$7TC3p4LH{Q{?}nTywV9zx^om;uwp3CN%; z>=Bi*=Ss$`!4j!FYVBM04RPaKH!J=&iTJLN;E5a!|A|gnjA$&FReb4_RAT{2dZ^93 zwvn}M-UOLwLF)@JPO!56#JM&w`@|uwr*KUB=IPO|jYzFMk6btPZ@$_=r}f`FC(EE^ zA?zqQGKjg}C8hY?2RI?r? z0lxzRG%?dKU)tcnp=FVN64sARTsTo~DLHb=vU0N4Cb!{nxB#J~fcn!%@Kv~gOKb8Zva-S5-7R+?^PMyqoajX^Ei{%UF;4KEX?mzZv2Q)28vYBpH_*fVc!Q%E zEA>B8Fz(LQ*9V4bzuSjx{`$qY2+{NYQ&QS5y@@v0;}Wr=nVVgvL5002#$8k7*YX>hI1nKke5{44$>uAqY#v9nrd$E$pF z-vk_1hu~1bl)K(|18N7EmadE90oJ(8ad_eI205*vGK0KCtB>483fe>Fd>BwIb;tf5 z2+?4C#^Jf6>sml9W~&#O}vm&0DN2VLd-_g2(KW=z|I5 zdI~9jU9&N7h9WM}^9c%U;6;e&9+z!*iH-4$8$n$&3%!As5G}%bq&N+n8V9ZyoR88! z4Vx>>y=;cCfu?cgnvK+<(AFYN(NxCm@5gReEU+y-D9P&JnO6%}=!%?3Z>4~*Kn>{U zrzg5ItMvSZD1%I6I3JWejDN^VPL&?T$S`PJ%%Q4yP=VY-DO0Q^<^*alZ`8XJ7vReLmc#?Ip=Z9^$l}OJ}u%=D_SANaS zVM=*@^%FFkqon~)ts}-f>^g6Lif2}fHb}B*ooqfvFmvan{dgV>Gv5y4z_u7=Fn9Pr z`kU19pHZ3=aQudLeXOTnxvRjqcfH8$Fv{YX^sjZfkC4NdxI3Et|4ttipt~P<{oehq zat~i-^Q*INIbF%p=+kUD<378-BM$T$_ zFpMr!QO3CePW$00rpr+>J83FCAftOn(Dk^ioJv2naiP-NxpFM8U9Qh7+e#p=B5n7^ zgQ6UFWhAWGLCG+#F>gu6JaKmZ;~8(`3+0)L?~D$2hOv)7c}Fakgl*YmSrwnKavAbc z@?hkbx=_6|Y5aX5KhV3U&nyetX?R_@8`JYebD-5(Wtl@Deq%<(Pa9@^EUza%d+f|# zH{mj=OQTJy);YuG!%QekcSLJqb(ot!ReAEwHXO&fG91`HD`m1WLQtIK;iaMOTV_|J z!^3=~8z@o`QM_Fj(e&;Wi_yo9aC1nXDINq80t)6N!QfL3!4;mgy19+c2*-bO$ell?_yjRdPr*woFd4r|aTU^-fh=)0e;($G;LlA3B=U|xqR@=@hMEO4tA z-=EUbWDZlLA7#tR{%*C!6GsVO4`w2Qs)gZRsE7#Tz2Ao=jN&`Fugj)(ZyVWx<3r=4CM?Y0T zG3;5OOce1!)HF9`wX5C5-pHw2=}|~Ne&6Ui{f1MevJ*Sxa+HaGFKj$hki#IwzrEay z6BaNEZ4{PHQxk7|UdS<-*XV<4v;tS9&2| zgAR5?w8jmu@#rkij7Q%z^R-t}wJyV+)g`4WUBbyRSI1UOXaycph7}Wu@&m|$?o*qQ zl3nv(CNBShmM}j>j*hH1^(}A>u~O~`GpeW&QPxx}nf5IzzDd!GgTFjXlC-Id>Ol)! zjge#LoT74O5?y_hO2b}noY2&Adu)qNM!hx}H_x@>Pf6zZ92;n*hJ=EbNKu**of-`& z7O&zT_B2|r*$u(qskQA-w?A8rA(I(i+P12tIj}IC1^CV2n7W*G7QD$oUuJ0@D$8BF zL<LUR47Q#lt!+lt%jxTw1DEx&|*SSV)=swL#b@0X0lm4 z<0)1+I3(!B3*>m5Y<`W%LhS7!YW}67&Muv7psT%SyX5-zneHbx&9Et5wUEon;i1Q1 zQIRU97H(I_+aBPe=YL424vkujKFi=y3$UA1F|jl76nX`XqlmoAd({$GJnn`#NlKqN zp{`}VPjiqk%Vhj|ufE_tXpJ{y`ya?v?!My<-}znS?!cN`_ND3%6I@AUw(iY5WiyNV z79L4qk&0-W7+aq1qI^v$i;iiHxq`4D#Y(|wq)>~qc&on_b|y*8!fvW}IOVP|*EudOx~Gmc-(Vt$=FalRC=I1MKh;nLaP}~!F(@KaVCK;R!Ce|_@SFt`&W4X~ z-WKlr3?)wIt1N9tXADp8{n_M>+>WJJym_;^0<9i(6cfi5BP*{qDhpk~rgK)s?4@z$ z7K-SoT=f`inzDOjmC&{;@iM42xHXx+4KzssKG!Xhiab08nK5hJIa+-OQs2(MHmTyj@z|IJ; zqR&7?WMuj#6)e$Hd1T_)RW-}&Wqhx4G~E%dMS2uUB2PG{_Inh24;Wf_e>GIF|3=Io zTXN4rl9S4mMlq#oCF`485tVANj}eh4G8Rxz0-M}({P@FJm(BESOEWfFd_UH=*k4gB zp0BS7)+@4GY{77<*LF4PS6;J0TkdfC<$G*4s9due-Ax0m(%+D zuDSZ2RJz{oSL{}kUPZb_b9$>E*yKw(a({7cubdv2^;9R#=mHlYEAR%KFGffT7nz&HliK!2bWcwNDR;@<1b59|;Sr?XQbCew(Tv(P znVX!Oj18fh62Kht<_JupKjy8nt26fG&mX=Uma%=xi`nvBx%h6|U&xK8A3ln^tHeBS z|DWywr59WxSHBGT&x=)SecE7TMt(6%evdaMCMNdJpSMmtE4lPDxFjYvM)&A(e^<`Y z8Re1bUuU{`ld^Odj?M~I2PcbuZ-BamnrojrC2%FE@o3+2AgEF3UwZzxI}QK;$NwY$ G!2bf@%362; literal 0 HcmV?d00001 diff --git a/packages/pinball_audio/lib/gen/assets.gen.dart b/packages/pinball_audio/lib/gen/assets.gen.dart index 1b3bdfb9..0f68e170 100644 --- a/packages/pinball_audio/lib/gen/assets.gen.dart +++ b/packages/pinball_audio/lib/gen/assets.gen.dart @@ -15,6 +15,7 @@ class $AssetsSfxGen { const $AssetsSfxGen(); String get google => 'assets/sfx/google.mp3'; + String get ioPinballVoiceOver => 'assets/sfx/io_pinball_voice_over.mp3'; String get plim => 'assets/sfx/plim.mp3'; } diff --git a/packages/pinball_audio/lib/src/pinball_audio.dart b/packages/pinball_audio/lib/src/pinball_audio.dart index 8bda14e5..f87b05d1 100644 --- a/packages/pinball_audio/lib/src/pinball_audio.dart +++ b/packages/pinball_audio/lib/src/pinball_audio.dart @@ -74,6 +74,7 @@ class PinballAudio { await Future.wait([ _preCacheSingleAudio(_prefixFile(Assets.sfx.google)), + _preCacheSingleAudio(_prefixFile(Assets.sfx.ioPinballVoiceOver)), _preCacheSingleAudio(_prefixFile(Assets.music.background)), ]); } @@ -88,6 +89,11 @@ class PinballAudio { _playSingleAudio(_prefixFile(Assets.sfx.google)); } + /// Plays the I/O Pinball voice over audio. + void ioPinballVoiceOver() { + _playSingleAudio(_prefixFile(Assets.sfx.ioPinballVoiceOver)); + } + /// Plays the background music void backgroundMusic() { _loopSingleAudio(_prefixFile(Assets.music.background)); diff --git a/packages/pinball_audio/test/src/pinball_audio_test.dart b/packages/pinball_audio/test/src/pinball_audio_test.dart index c92b876d..9d6dff98 100644 --- a/packages/pinball_audio/test/src/pinball_audio_test.dart +++ b/packages/pinball_audio/test/src/pinball_audio_test.dart @@ -125,6 +125,11 @@ void main() { () => preCacheSingleAudio .onCall('packages/pinball_audio/assets/sfx/google.mp3'), ).called(1); + verify( + () => preCacheSingleAudio.onCall( + 'packages/pinball_audio/assets/sfx/io_pinball_voice_over.mp3', + ), + ).called(1); verify( () => preCacheSingleAudio .onCall('packages/pinball_audio/assets/music/background.mp3'), @@ -163,6 +168,19 @@ void main() { }); }); + group('ioPinballVoiceOver', () { + test('plays the correct file', () async { + await audio.load(); + audio.ioPinballVoiceOver(); + + verify( + () => playSingleAudio.onCall( + 'packages/pinball_audio/${Assets.sfx.ioPinballVoiceOver}', + ), + ).called(1); + }); + }); + group('backgroundMusic', () { test('plays the correct file', () async { await audio.load(); diff --git a/test/how_to_play/how_to_play_dialog_test.dart b/test/how_to_play/how_to_play_dialog_test.dart index 2570c846..232aa1d5 100644 --- a/test/how_to_play/how_to_play_dialog_test.dart +++ b/test/how_to_play/how_to_play_dialog_test.dart @@ -3,10 +3,13 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; import 'package:pinball/how_to_play/how_to_play.dart'; import 'package:pinball/l10n/l10n.dart'; +import 'package:pinball_audio/pinball_audio.dart'; import 'package:platform_helper/platform_helper.dart'; import '../helpers/helpers.dart'; +class _MockPinballAudio extends Mock implements PinballAudio {} + class _MockPlatformHelper extends Mock implements PlatformHelper {} void main() { @@ -93,5 +96,30 @@ void main() { await tester.pumpAndSettle(); expect(find.byType(HowToPlayDialog), findsNothing); }); + + testWidgets( + 'plays the I/O Pinball voice over audio on dismiss', + (tester) async { + final audio = _MockPinballAudio(); + await tester.pumpApp( + Builder( + builder: (context) { + return TextButton( + onPressed: () => showHowToPlayDialog(context), + child: const Text('test'), + ); + }, + ), + pinballAudio: audio, + ); + expect(find.byType(HowToPlayDialog), findsNothing); + await tester.tap(find.text('test')); + await tester.pumpAndSettle(); + + await tester.tapAt(Offset.zero); + await tester.pumpAndSettle(); + verify(audio.ioPinballVoiceOver).called(1); + }, + ); }); } From 6e4651f89e3a5a7c18f1306cd34273b2197c010b Mon Sep 17 00:00:00 2001 From: Tom Arra Date: Tue, 3 May 2022 12:41:24 -0500 Subject: [PATCH 04/10] chore: remove VGV copyright (#292) --- lib/app/app.dart | 7 ------- lib/app/view/app.dart | 7 ------- lib/bootstrap.dart | 7 ------- lib/l10n/l10n.dart | 7 ------- lib/main_development.dart | 7 ------- lib/main_production.dart | 7 ------- lib/main_staging.dart | 7 ------- packages/pinball_components/sandbox/lib/main.dart | 6 ------ test/app/view/app_test.dart | 7 ------- test/helpers/helpers.dart | 6 ------ test/helpers/pump_app.dart | 7 ------- 11 files changed, 75 deletions(-) diff --git a/lib/app/app.dart b/lib/app/app.dart index 2b135918..f23ab3c8 100644 --- a/lib/app/app.dart +++ b/lib/app/app.dart @@ -1,8 +1 @@ -// Copyright (c) 2021, Very Good Ventures -// https://verygood.ventures -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - export 'view/app.dart'; diff --git a/lib/app/view/app.dart b/lib/app/view/app.dart index 528954a6..d778b55b 100644 --- a/lib/app/view/app.dart +++ b/lib/app/view/app.dart @@ -1,10 +1,3 @@ -// Copyright (c) 2021, Very Good Ventures -// https://verygood.ventures -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - // ignore_for_file: public_member_api_docs import 'package:authentication_repository/authentication_repository.dart'; diff --git a/lib/bootstrap.dart b/lib/bootstrap.dart index bbd87f0c..c5e42951 100644 --- a/lib/bootstrap.dart +++ b/lib/bootstrap.dart @@ -1,10 +1,3 @@ -// Copyright (c) 2021, Very Good Ventures -// https://verygood.ventures -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - // ignore_for_file: public_member_api_docs import 'dart:async'; diff --git a/lib/l10n/l10n.dart b/lib/l10n/l10n.dart index 548a81a6..0945f30f 100644 --- a/lib/l10n/l10n.dart +++ b/lib/l10n/l10n.dart @@ -1,10 +1,3 @@ -// Copyright (c) 2021, Very Good Ventures -// https://verygood.ventures -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - // ignore_for_file: public_member_api_docs import 'package:flutter/widgets.dart'; diff --git a/lib/main_development.dart b/lib/main_development.dart index 529c66e2..21166057 100644 --- a/lib/main_development.dart +++ b/lib/main_development.dart @@ -1,10 +1,3 @@ -// Copyright (c) 2021, Very Good Ventures -// https://verygood.ventures -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - import 'dart:async'; import 'package:authentication_repository/authentication_repository.dart'; diff --git a/lib/main_production.dart b/lib/main_production.dart index 529c66e2..21166057 100644 --- a/lib/main_production.dart +++ b/lib/main_production.dart @@ -1,10 +1,3 @@ -// Copyright (c) 2021, Very Good Ventures -// https://verygood.ventures -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - import 'dart:async'; import 'package:authentication_repository/authentication_repository.dart'; diff --git a/lib/main_staging.dart b/lib/main_staging.dart index 529c66e2..21166057 100644 --- a/lib/main_staging.dart +++ b/lib/main_staging.dart @@ -1,10 +1,3 @@ -// Copyright (c) 2021, Very Good Ventures -// https://verygood.ventures -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - import 'dart:async'; import 'package:authentication_repository/authentication_repository.dart'; diff --git a/packages/pinball_components/sandbox/lib/main.dart b/packages/pinball_components/sandbox/lib/main.dart index 9bce5632..cb268b41 100644 --- a/packages/pinball_components/sandbox/lib/main.dart +++ b/packages/pinball_components/sandbox/lib/main.dart @@ -1,9 +1,3 @@ -// Copyright (c) 2022, Very Good Ventures -// https://verygood.ventures -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. import 'package:dashbook/dashbook.dart'; import 'package:flutter/material.dart'; import 'package:sandbox/stories/stories.dart'; diff --git a/test/app/view/app_test.dart b/test/app/view/app_test.dart index 5ba5aca7..ca1cedff 100644 --- a/test/app/view/app_test.dart +++ b/test/app/view/app_test.dart @@ -1,10 +1,3 @@ -// Copyright (c) 2021, Very Good Ventures -// https://verygood.ventures -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - import 'package:authentication_repository/authentication_repository.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:leaderboard_repository/leaderboard_repository.dart'; diff --git a/test/helpers/helpers.dart b/test/helpers/helpers.dart index 50bb9bc1..febf8d36 100644 --- a/test/helpers/helpers.dart +++ b/test/helpers/helpers.dart @@ -1,9 +1,3 @@ -// -// Copyright (c) 2021, Very Good Ventures -// Use of this source code is governed by an MIT-style -// https://opensource.org/licenses/MIT. -// https://verygood.ventures -// license that can be found in the LICENSE file or at export 'builders.dart'; export 'fakes.dart'; export 'forge2d.dart'; diff --git a/test/helpers/pump_app.dart b/test/helpers/pump_app.dart index 8c852f4e..a7d7ae67 100644 --- a/test/helpers/pump_app.dart +++ b/test/helpers/pump_app.dart @@ -1,10 +1,3 @@ -// Copyright (c) 2021, Very Good Ventures -// https://verygood.ventures -// -// Use of this source code is governed by an MIT-style -// license that can be found in the LICENSE file or at -// https://opensource.org/licenses/MIT. - import 'package:bloc_test/bloc_test.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; From c67db0e55c9c1835f7b5a18d4a041320742f116e Mon Sep 17 00:00:00 2001 From: Alejandro Santiago Date: Tue, 3 May 2022 18:54:11 +0100 Subject: [PATCH 05/10] refactor: moved scaling logic to `BallScalingBehavior` (#313) --- .../lib/src/components/{ => ball}/ball.dart | 29 +++--- .../ball/behaviors/ball_scaling_behavior.dart | 24 +++++ .../components/ball/behaviors/behaviors.dart | 1 + .../lib/src/components/components.dart | 2 +- .../src/components/{ => ball}/ball_test.dart | 63 ++++++------ .../behaviors/ball_scaling_behavior_test.dart | 99 +++++++++++++++++++ 6 files changed, 171 insertions(+), 47 deletions(-) rename packages/pinball_components/lib/src/components/{ => ball}/ball.dart (88%) create mode 100644 packages/pinball_components/lib/src/components/ball/behaviors/ball_scaling_behavior.dart create mode 100644 packages/pinball_components/lib/src/components/ball/behaviors/behaviors.dart rename packages/pinball_components/test/src/components/{ => ball}/ball_test.dart (78%) create mode 100644 packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart diff --git a/packages/pinball_components/lib/src/components/ball.dart b/packages/pinball_components/lib/src/components/ball/ball.dart similarity index 88% rename from packages/pinball_components/lib/src/components/ball.dart rename to packages/pinball_components/lib/src/components/ball/ball.dart index 7469396a..4f913c2c 100644 --- a/packages/pinball_components/lib/src/components/ball.dart +++ b/packages/pinball_components/lib/src/components/ball/ball.dart @@ -1,11 +1,11 @@ import 'dart:async'; import 'dart:math' as math; -import 'dart:ui'; import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/widgets.dart'; import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/src/components/ball/behaviors/ball_scaling_behavior.dart'; import 'package:pinball_flame/pinball_flame.dart'; /// {@template ball} @@ -20,6 +20,7 @@ class Ball extends BodyComponent renderBody: false, children: [ _BallSpriteComponent()..tint(baseColor.withOpacity(0.5)), + BallScalingBehavior(), ], ) { // TODO(ruimiguel): while developing Ball can be launched by clicking mouse, @@ -30,6 +31,15 @@ class Ball extends BodyComponent layer = Layer.board; } + /// Creates a [Ball] without any behaviors. + /// + /// This can be used for testing [Ball]'s behaviors in isolation. + @visibleForTesting + Ball.test({required this.baseColor}) + : super( + children: [_BallSpriteComponent()], + ); + /// The size of the [Ball]. static final Vector2 size = Vector2.all(4.13); @@ -81,26 +91,9 @@ class Ball extends BodyComponent void update(double dt) { super.update(dt); - _rescaleSize(); _setPositionalGravity(); } - void _rescaleSize() { - final boardHeight = BoardDimensions.bounds.height; - const maxShrinkValue = BoardDimensions.perspectiveShrinkFactor; - - final standardizedYPosition = body.position.y + (boardHeight / 2); - - final scaleFactor = maxShrinkValue + - ((standardizedYPosition / boardHeight) * (1 - maxShrinkValue)); - - body.fixtures.first.shape.radius = (size.x / 2) * scaleFactor; - - // TODO(alestiago): Revisit and see if there's a better way to do this. - final spriteComponent = firstChild<_BallSpriteComponent>(); - spriteComponent?.scale = Vector2.all(scaleFactor); - } - void _setPositionalGravity() { final defaultGravity = gameRef.world.gravity.y; final maxXDeviationFromCenter = BoardDimensions.bounds.width / 2; diff --git a/packages/pinball_components/lib/src/components/ball/behaviors/ball_scaling_behavior.dart b/packages/pinball_components/lib/src/components/ball/behaviors/ball_scaling_behavior.dart new file mode 100644 index 00000000..7fc06fb1 --- /dev/null +++ b/packages/pinball_components/lib/src/components/ball/behaviors/ball_scaling_behavior.dart @@ -0,0 +1,24 @@ +import 'package:flame/components.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +/// Scales the ball's body and sprite according to its position on the board. +class BallScalingBehavior extends Component with ParentIsA { + @override + void update(double dt) { + super.update(dt); + final boardHeight = BoardDimensions.bounds.height; + const maxShrinkValue = BoardDimensions.perspectiveShrinkFactor; + + final standardizedYPosition = parent.body.position.y + (boardHeight / 2); + final scaleFactor = maxShrinkValue + + ((standardizedYPosition / boardHeight) * (1 - maxShrinkValue)); + + parent.body.fixtures.first.shape.radius = (Ball.size.x / 2) * scaleFactor; + + parent.firstChild()!.scale.setValues( + scaleFactor, + scaleFactor, + ); + } +} diff --git a/packages/pinball_components/lib/src/components/ball/behaviors/behaviors.dart b/packages/pinball_components/lib/src/components/ball/behaviors/behaviors.dart new file mode 100644 index 00000000..22928734 --- /dev/null +++ b/packages/pinball_components/lib/src/components/ball/behaviors/behaviors.dart @@ -0,0 +1 @@ +export 'ball_scaling_behavior.dart'; diff --git a/packages/pinball_components/lib/src/components/components.dart b/packages/pinball_components/lib/src/components/components.dart index c5ea7f9f..6e79ac56 100644 --- a/packages/pinball_components/lib/src/components/components.dart +++ b/packages/pinball_components/lib/src/components/components.dart @@ -2,7 +2,7 @@ export 'android_animatronic.dart'; export 'android_bumper/android_bumper.dart'; export 'android_spaceship/android_spaceship.dart'; export 'backboard/backboard.dart'; -export 'ball.dart'; +export 'ball/ball.dart'; export 'baseboard.dart'; export 'board_background_sprite_component.dart'; export 'board_dimensions.dart'; diff --git a/packages/pinball_components/test/src/components/ball_test.dart b/packages/pinball_components/test/src/components/ball/ball_test.dart similarity index 78% rename from packages/pinball_components/test/src/components/ball_test.dart rename to packages/pinball_components/test/src/components/ball/ball_test.dart index 26a03886..321e137b 100644 --- a/packages/pinball_components/test/src/components/ball_test.dart +++ b/packages/pinball_components/test/src/components/ball/ball_test.dart @@ -6,18 +6,29 @@ import 'package:flame_test/flame_test.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/src/components/ball/behaviors/behaviors.dart'; -import '../../helpers/helpers.dart'; +import '../../../helpers/helpers.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); final flameTester = FlameTester(TestGame.new); group('Ball', () { + const baseColor = Color(0xFFFFFFFF); + + test( + 'can be instantiated', + () { + expect(Ball(baseColor: baseColor), isA()); + expect(Ball.test(baseColor: baseColor), isA()); + }, + ); + flameTester.test( 'loads correctly', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ready(); await game.ensureAdd(ball); @@ -25,11 +36,20 @@ void main() { }, ); + flameTester.test('add a BallScalingBehavior', (game) async { + final ball = Ball(baseColor: baseColor); + await game.ensureAdd(ball); + expect( + ball.descendants().whereType().length, + equals(1), + ); + }); + group('body', () { flameTester.test( 'is dynamic', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ensureAdd(ball); expect(ball.body.bodyType, equals(BodyType.dynamic)); @@ -38,7 +58,7 @@ void main() { group('can be moved', () { flameTester.test('by its weight', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ensureAdd(ball); game.update(1); @@ -46,7 +66,7 @@ void main() { }); flameTester.test('by applying velocity', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ensureAdd(ball); ball.body.gravityScale = Vector2.zero(); @@ -61,7 +81,7 @@ void main() { flameTester.test( 'exists', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ensureAdd(ball); expect(ball.body.fixtures[0], isA()); @@ -71,7 +91,7 @@ void main() { flameTester.test( 'is dense', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ensureAdd(ball); final fixture = ball.body.fixtures[0]; @@ -82,7 +102,7 @@ void main() { flameTester.test( 'shape is circular', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ensureAdd(ball); final fixture = ball.body.fixtures[0]; @@ -94,7 +114,7 @@ void main() { flameTester.test( 'has Layer.all as default filter maskBits', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ready(); await game.ensureAdd(ball); await game.ready(); @@ -108,7 +128,7 @@ void main() { group('stop', () { group("can't be moved", () { flameTester.test('by its weight', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ensureAdd(ball); ball.stop(); @@ -116,19 +136,6 @@ void main() { expect(ball.body.position, equals(ball.initialPosition)); }); }); - - // TODO(allisonryan0002): delete or retest this if/when solution is added - // to prevent forces on a ball while stopped. - - // flameTester.test('by applying velocity', (game) async { - // final ball = Ball(baseColor: Colors.blue); - // await game.ensureAdd(ball); - // ball.stop(); - - // ball.body.linearVelocity.setValues(10, 10); - // game.update(1); - // expect(ball.body.position, equals(ball.initialPosition)); - // }); }); group('resume', () { @@ -136,7 +143,7 @@ void main() { flameTester.test( 'by its weight when previously stopped', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ensureAdd(ball); ball.stop(); ball.resume(); @@ -149,7 +156,7 @@ void main() { flameTester.test( 'by applying velocity when previously stopped', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ensureAdd(ball); ball.stop(); ball.resume(); @@ -165,7 +172,7 @@ void main() { group('boost', () { flameTester.test('applies an impulse to the ball', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ensureAdd(ball); expect(ball.body.linearVelocity, equals(Vector2.zero())); @@ -176,7 +183,7 @@ void main() { }); flameTester.test('adds TurboChargeSpriteAnimation', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ensureAdd(ball); await ball.boost(Vector2.all(10)); @@ -190,7 +197,7 @@ void main() { flameTester.test('removes TurboChargeSpriteAnimation after it finishes', (game) async { - final ball = Ball(baseColor: Colors.blue); + final ball = Ball(baseColor: baseColor); await game.ensureAdd(ball); await ball.boost(Vector2.all(10)); diff --git a/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart b/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart new file mode 100644 index 00000000..42cd9073 --- /dev/null +++ b/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart @@ -0,0 +1,99 @@ +// ignore_for_file: cascade_invocations + +import 'dart:ui'; + +import 'package:flame/components.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/src/components/ball/behaviors/behaviors.dart'; + +import '../../../../helpers/helpers.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final asset = Assets.images.ball.ball.keyName; + final flameTester = FlameTester(() => TestGame([asset])); + + group('BallScalingBehavior', () { + const baseColor = Color(0xFFFFFFFF); + test('can be instantiated', () { + expect( + BallScalingBehavior(), + isA(), + ); + }); + + flameTester.test('can be loaded', (game) async { + final ball = Ball.test(baseColor: baseColor); + final behavior = BallScalingBehavior(); + await ball.add(behavior); + await game.ensureAdd(ball); + expect( + ball.firstChild(), + equals(behavior), + ); + }); + + flameTester.test('can be loaded', (game) async { + final ball = Ball.test(baseColor: baseColor); + final behavior = BallScalingBehavior(); + await ball.add(behavior); + await game.ensureAdd(ball); + expect( + ball.firstChild(), + equals(behavior), + ); + }); + + flameTester.test('scales the shape radius', (game) async { + final ball1 = Ball.test(baseColor: baseColor) + ..initialPosition = Vector2(0, 10); + await ball1.add(BallScalingBehavior()); + + final ball2 = Ball.test(baseColor: baseColor) + ..initialPosition = Vector2(0, -10); + await ball2.add(BallScalingBehavior()); + + await game.ensureAddAll([ball1, ball2]); + game.update(1); + + final shape1 = ball1.body.fixtures.first.shape; + final shape2 = ball2.body.fixtures.first.shape; + expect( + shape1.radius, + greaterThan(shape2.radius), + ); + }); + + flameTester.testGameWidget( + 'scales the sprite', + setUp: (game, tester) async { + final ball1 = Ball.test(baseColor: baseColor) + ..initialPosition = Vector2(0, 10); + await ball1.add(BallScalingBehavior()); + + final ball2 = Ball.test(baseColor: baseColor) + ..initialPosition = Vector2(0, -10); + await ball2.add(BallScalingBehavior()); + + await game.ensureAddAll([ball1, ball2]); + game.update(1); + + await tester.pump(); + await game.ready(); + + final sprite1 = ball1.firstChild()!; + final sprite2 = ball2.firstChild()!; + expect( + sprite1.scale.x, + greaterThan(sprite2.scale.x), + ); + expect( + sprite1.scale.y, + greaterThan(sprite2.scale.y), + ); + }, + ); + }); +} From 01dc3f387ac9e2eea881c3c10c9291ba53f0e748 Mon Sep 17 00:00:00 2001 From: Alejandro Santiago Date: Tue, 3 May 2022 19:48:06 +0100 Subject: [PATCH 06/10] refactor: moved gravity logic to `BallGravitatingBehavior` (#314) --- .../lib/src/components/ball/ball.dart | 27 +------- .../behaviors/ball_gravitating_behavior.dart | 35 +++++++++++ .../components/ball/behaviors/behaviors.dart | 1 + .../test/src/components/ball/ball_test.dart | 25 +++++--- .../ball_gravitating_behavior_test.dart | 63 +++++++++++++++++++ .../behaviors/ball_scaling_behavior_test.dart | 18 +----- 6 files changed, 121 insertions(+), 48 deletions(-) create mode 100644 packages/pinball_components/lib/src/components/ball/behaviors/ball_gravitating_behavior.dart create mode 100644 packages/pinball_components/test/src/components/ball/behaviors/ball_gravitating_behavior_test.dart diff --git a/packages/pinball_components/lib/src/components/ball/ball.dart b/packages/pinball_components/lib/src/components/ball/ball.dart index 4f913c2c..dea4c0b4 100644 --- a/packages/pinball_components/lib/src/components/ball/ball.dart +++ b/packages/pinball_components/lib/src/components/ball/ball.dart @@ -5,6 +5,7 @@ import 'package:flame/components.dart'; import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/widgets.dart'; import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/src/components/ball/behaviors/ball_gravitating_behavior.dart'; import 'package:pinball_components/src/components/ball/behaviors/ball_scaling_behavior.dart'; import 'package:pinball_flame/pinball_flame.dart'; @@ -21,6 +22,7 @@ class Ball extends BodyComponent children: [ _BallSpriteComponent()..tint(baseColor.withOpacity(0.5)), BallScalingBehavior(), + BallGravitatingBehavior(), ], ) { // TODO(ruimiguel): while developing Ball can be launched by clicking mouse, @@ -86,31 +88,6 @@ class Ball extends BodyComponent body.linearVelocity = impulse; await add(_TurboChargeSpriteAnimationComponent()); } - - @override - void update(double dt) { - super.update(dt); - - _setPositionalGravity(); - } - - void _setPositionalGravity() { - final defaultGravity = gameRef.world.gravity.y; - final maxXDeviationFromCenter = BoardDimensions.bounds.width / 2; - const maxXGravityPercentage = - (1 - BoardDimensions.perspectiveShrinkFactor) / 2; - final xDeviationFromCenter = body.position.x; - - final positionalXForce = ((xDeviationFromCenter / maxXDeviationFromCenter) * - maxXGravityPercentage) * - defaultGravity; - - final positionalYForce = math.sqrt( - math.pow(defaultGravity, 2) - math.pow(positionalXForce, 2), - ); - - body.gravityOverride = Vector2(positionalXForce, positionalYForce); - } } class _BallSpriteComponent extends SpriteComponent with HasGameRef { diff --git a/packages/pinball_components/lib/src/components/ball/behaviors/ball_gravitating_behavior.dart b/packages/pinball_components/lib/src/components/ball/behaviors/ball_gravitating_behavior.dart new file mode 100644 index 00000000..bad129a6 --- /dev/null +++ b/packages/pinball_components/lib/src/components/ball/behaviors/ball_gravitating_behavior.dart @@ -0,0 +1,35 @@ +import 'dart:math' as math; + +import 'package:flame/components.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +/// Scales the ball's gravity according to its position on the board. +class BallGravitatingBehavior extends Component + with ParentIsA, HasGameRef { + @override + void update(double dt) { + super.update(dt); + final defaultGravity = gameRef.world.gravity.y; + + final maxXDeviationFromCenter = BoardDimensions.bounds.width / 2; + const maxXGravityPercentage = + (1 - BoardDimensions.perspectiveShrinkFactor) / 2; + final xDeviationFromCenter = parent.body.position.x; + + final positionalXForce = ((xDeviationFromCenter / maxXDeviationFromCenter) * + maxXGravityPercentage) * + defaultGravity; + final positionalYForce = math.sqrt( + math.pow(defaultGravity, 2) - math.pow(positionalXForce, 2), + ); + + final gravityOverride = parent.body.gravityOverride; + if (gravityOverride != null) { + gravityOverride.setValues(positionalXForce, positionalYForce); + } else { + parent.body.gravityOverride = Vector2(positionalXForce, positionalYForce); + } + } +} diff --git a/packages/pinball_components/lib/src/components/ball/behaviors/behaviors.dart b/packages/pinball_components/lib/src/components/ball/behaviors/behaviors.dart index 22928734..038b7833 100644 --- a/packages/pinball_components/lib/src/components/ball/behaviors/behaviors.dart +++ b/packages/pinball_components/lib/src/components/ball/behaviors/behaviors.dart @@ -1 +1,2 @@ +export 'ball_gravitating_behavior.dart'; export 'ball_scaling_behavior.dart'; diff --git a/packages/pinball_components/test/src/components/ball/ball_test.dart b/packages/pinball_components/test/src/components/ball/ball_test.dart index 321e137b..02175f16 100644 --- a/packages/pinball_components/test/src/components/ball/ball_test.dart +++ b/packages/pinball_components/test/src/components/ball/ball_test.dart @@ -36,13 +36,24 @@ void main() { }, ); - flameTester.test('add a BallScalingBehavior', (game) async { - final ball = Ball(baseColor: baseColor); - await game.ensureAdd(ball); - expect( - ball.descendants().whereType().length, - equals(1), - ); + group('adds', () { + flameTester.test('a BallScalingBehavior', (game) async { + final ball = Ball(baseColor: baseColor); + await game.ensureAdd(ball); + expect( + ball.descendants().whereType().length, + equals(1), + ); + }); + + flameTester.test('a BallGravitatingBehavior', (game) async { + final ball = Ball(baseColor: baseColor); + await game.ensureAdd(ball); + expect( + ball.descendants().whereType().length, + equals(1), + ); + }); }); group('body', () { diff --git a/packages/pinball_components/test/src/components/ball/behaviors/ball_gravitating_behavior_test.dart b/packages/pinball_components/test/src/components/ball/behaviors/ball_gravitating_behavior_test.dart new file mode 100644 index 00000000..de291f21 --- /dev/null +++ b/packages/pinball_components/test/src/components/ball/behaviors/ball_gravitating_behavior_test.dart @@ -0,0 +1,63 @@ +// ignore_for_file: cascade_invocations + +import 'dart:ui'; + +import 'package:flame/components.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_components/pinball_components.dart'; +import 'package:pinball_components/src/components/ball/behaviors/behaviors.dart'; + +import '../../../../helpers/helpers.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final asset = Assets.images.ball.ball.keyName; + final flameTester = FlameTester(() => TestGame([asset])); + + group('BallGravitatingBehavior', () { + const baseColor = Color(0xFFFFFFFF); + test('can be instantiated', () { + expect( + BallGravitatingBehavior(), + isA(), + ); + }); + + flameTester.test('can be loaded', (game) async { + final ball = Ball.test(baseColor: baseColor); + final behavior = BallGravitatingBehavior(); + await ball.add(behavior); + await game.ensureAdd(ball); + expect( + ball.firstChild(), + equals(behavior), + ); + }); + + flameTester.test( + "overrides the body's horizontal gravity symmetrically", + (game) async { + final ball1 = Ball.test(baseColor: baseColor) + ..initialPosition = Vector2(10, 0); + await ball1.add(BallGravitatingBehavior()); + + final ball2 = Ball.test(baseColor: baseColor) + ..initialPosition = Vector2(-10, 0); + await ball2.add(BallGravitatingBehavior()); + + await game.ensureAddAll([ball1, ball2]); + game.update(1); + + expect( + ball1.body.gravityOverride!.x, + equals(-ball2.body.gravityOverride!.x), + ); + expect( + ball1.body.gravityOverride!.y, + equals(ball2.body.gravityOverride!.y), + ); + }, + ); + }); +} diff --git a/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart b/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart index 42cd9073..cd0a0486 100644 --- a/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart +++ b/packages/pinball_components/test/src/components/ball/behaviors/ball_scaling_behavior_test.dart @@ -35,17 +35,6 @@ void main() { ); }); - flameTester.test('can be loaded', (game) async { - final ball = Ball.test(baseColor: baseColor); - final behavior = BallScalingBehavior(); - await ball.add(behavior); - await game.ensureAdd(ball); - expect( - ball.firstChild(), - equals(behavior), - ); - }); - flameTester.test('scales the shape radius', (game) async { final ball1 = Ball.test(baseColor: baseColor) ..initialPosition = Vector2(0, 10); @@ -66,9 +55,9 @@ void main() { ); }); - flameTester.testGameWidget( + flameTester.test( 'scales the sprite', - setUp: (game, tester) async { + (game) async { final ball1 = Ball.test(baseColor: baseColor) ..initialPosition = Vector2(0, 10); await ball1.add(BallScalingBehavior()); @@ -80,9 +69,6 @@ void main() { await game.ensureAddAll([ball1, ball2]); game.update(1); - await tester.pump(); - await game.ready(); - final sprite1 = ball1.firstChild()!; final sprite2 = ball2.firstChild()!; expect( From 40104d037dd0bd92d4a23a7962c640f4c6dd8445 Mon Sep 17 00:00:00 2001 From: Tom Arra Date: Tue, 3 May 2022 14:01:43 -0500 Subject: [PATCH 07/10] first config changes for release --- .firebaserc | 5 +++++ firebase.json | 8 ++------ web/__/firebase/8.10.1/firebase-app.js | 2 -- web/__/firebase/8.10.1/firebase-auth.js | 2 -- web/__/firebase/8.10.1/firebase-firestore.js | 2 -- web/__/firebase/init.js | 11 ----------- 6 files changed, 7 insertions(+), 23 deletions(-) create mode 100644 .firebaserc delete mode 100644 web/__/firebase/8.10.1/firebase-app.js delete mode 100644 web/__/firebase/8.10.1/firebase-auth.js delete mode 100644 web/__/firebase/8.10.1/firebase-firestore.js delete mode 100644 web/__/firebase/init.js diff --git a/.firebaserc b/.firebaserc new file mode 100644 index 00000000..98857542 --- /dev/null +++ b/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "io-pinball" + } +} diff --git a/firebase.json b/firebase.json index 80e2ae69..99025785 100644 --- a/firebase.json +++ b/firebase.json @@ -1,11 +1,7 @@ { "hosting": { "public": "build/web", - "site": "ashehwkdkdjruejdnensjsjdne", - "ignore": [ - "firebase.json", - "**/.*", - "**/node_modules/**" - ] + "site": "io-pinball", + "ignore": ["firebase.json", "**/.*", "**/node_modules/**"] } } diff --git a/web/__/firebase/8.10.1/firebase-app.js b/web/__/firebase/8.10.1/firebase-app.js deleted file mode 100644 index c688d1c4..00000000 --- a/web/__/firebase/8.10.1/firebase-app.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).firebase=t()}(this,function(){"use strict";var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};var n=function(){return(n=Object.assign||function(e){for(var t,n=1,r=arguments.length;na[0]&&t[1]=e.length?void 0:e)&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function f(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),a=[];try{for(;(void 0===t||0"})):"Error",e=this.serviceName+": "+e+" ("+o+").";return new c(o,e,i)},v);function v(e,t,n){this.service=e,this.serviceName=t,this.errors=n}var m=/\{\$([^}]+)}/g;function y(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function g(e,t){t=new b(e,t);return t.subscribe.bind(t)}var b=(I.prototype.next=function(t){this.forEachObserver(function(e){e.next(t)})},I.prototype.error=function(t){this.forEachObserver(function(e){e.error(t)}),this.close(t)},I.prototype.complete=function(){this.forEachObserver(function(e){e.complete()}),this.close()},I.prototype.subscribe=function(e,t,n){var r,i=this;if(void 0===e&&void 0===t&&void 0===n)throw new Error("Missing Observer.");void 0===(r=function(e,t){if("object"!=typeof e||null===e)return!1;for(var n=0,r=t;n=(null!=o?o:e.logLevel)&&a({level:R[t].toLowerCase(),message:i,args:n,type:e.name})}}(n[e])}var H=((H={})["no-app"]="No Firebase App '{$appName}' has been created - call Firebase App.initializeApp()",H["bad-app-name"]="Illegal App name: '{$appName}",H["duplicate-app"]="Firebase App named '{$appName}' already exists",H["app-deleted"]="Firebase App named '{$appName}' already deleted",H["invalid-app-argument"]="firebase.{$appName}() takes either no argument or a Firebase App instance.",H["invalid-log-argument"]="First argument to `onLog` must be null or a function.",H),V=new d("app","Firebase",H),B="@firebase/app",M="[DEFAULT]",U=((H={})[B]="fire-core",H["@firebase/analytics"]="fire-analytics",H["@firebase/app-check"]="fire-app-check",H["@firebase/auth"]="fire-auth",H["@firebase/database"]="fire-rtdb",H["@firebase/functions"]="fire-fn",H["@firebase/installations"]="fire-iid",H["@firebase/messaging"]="fire-fcm",H["@firebase/performance"]="fire-perf",H["@firebase/remote-config"]="fire-rc",H["@firebase/storage"]="fire-gcs",H["@firebase/firestore"]="fire-fst",H["fire-js"]="fire-js",H["firebase-wrapper"]="fire-js-all",H),W=new z("@firebase/app"),G=(Object.defineProperty($.prototype,"automaticDataCollectionEnabled",{get:function(){return this.checkDestroyed_(),this.automaticDataCollectionEnabled_},set:function(e){this.checkDestroyed_(),this.automaticDataCollectionEnabled_=e},enumerable:!1,configurable:!0}),Object.defineProperty($.prototype,"name",{get:function(){return this.checkDestroyed_(),this.name_},enumerable:!1,configurable:!0}),Object.defineProperty($.prototype,"options",{get:function(){return this.checkDestroyed_(),this.options_},enumerable:!1,configurable:!0}),$.prototype.delete=function(){var t=this;return new Promise(function(e){t.checkDestroyed_(),e()}).then(function(){return t.firebase_.INTERNAL.removeApp(t.name_),Promise.all(t.container.getProviders().map(function(e){return e.delete()}))}).then(function(){t.isDeleted_=!0})},$.prototype._getService=function(e,t){void 0===t&&(t=M),this.checkDestroyed_();var n=this.container.getProvider(e);return n.isInitialized()||"EXPLICIT"!==(null===(e=n.getComponent())||void 0===e?void 0:e.instantiationMode)||n.initialize(),n.getImmediate({identifier:t})},$.prototype._removeServiceInstance=function(e,t){void 0===t&&(t=M),this.container.getProvider(e).clearInstance(t)},$.prototype._addComponent=function(t){try{this.container.addComponent(t)}catch(e){W.debug("Component "+t.name+" failed to register with FirebaseApp "+this.name,e)}},$.prototype._addOrOverwriteComponent=function(e){this.container.addOrOverwriteComponent(e)},$.prototype.toJSON=function(){return{name:this.name,automaticDataCollectionEnabled:this.automaticDataCollectionEnabled,options:this.options}},$.prototype.checkDestroyed_=function(){if(this.isDeleted_)throw V.create("app-deleted",{appName:this.name_})},$);function $(e,t,n){var r=this;this.firebase_=n,this.isDeleted_=!1,this.name_=t.name,this.automaticDataCollectionEnabled_=t.automaticDataCollectionEnabled||!1,this.options_=h(void 0,e),this.container=new S(t.name),this._addComponent(new O("app",function(){return r},"PUBLIC")),this.firebase_.INTERNAL.components.forEach(function(e){return r._addComponent(e)})}G.prototype.name&&G.prototype.options||G.prototype.delete||console.log("dc");var K="8.10.1";function Y(a){var s={},l=new Map,c={__esModule:!0,initializeApp:function(e,t){void 0===t&&(t={});"object"==typeof t&&null!==t||(t={name:t});var n=t;void 0===n.name&&(n.name=M);t=n.name;if("string"!=typeof t||!t)throw V.create("bad-app-name",{appName:String(t)});if(y(s,t))throw V.create("duplicate-app",{appName:t});n=new a(e,n,c);return s[t]=n},app:u,registerVersion:function(e,t,n){var r=null!==(i=U[e])&&void 0!==i?i:e;n&&(r+="-"+n);var i=r.match(/\s|\//),e=t.match(/\s|\//);i||e?(n=['Unable to register library "'+r+'" with version "'+t+'":'],i&&n.push('library name "'+r+'" contains illegal characters (whitespace or "/")'),i&&e&&n.push("and"),e&&n.push('version name "'+t+'" contains illegal characters (whitespace or "/")'),W.warn(n.join(" "))):o(new O(r+"-version",function(){return{library:r,version:t}},"VERSION"))},setLogLevel:T,onLog:function(e,t){if(null!==e&&"function"!=typeof e)throw V.create("invalid-log-argument");x(e,t)},apps:null,SDK_VERSION:K,INTERNAL:{registerComponent:o,removeApp:function(e){delete s[e]},components:l,useAsService:function(e,t){return"serverAuth"!==t?t:null}}};function u(e){if(!y(s,e=e||M))throw V.create("no-app",{appName:e});return s[e]}function o(n){var e,r=n.name;if(l.has(r))return W.debug("There were multiple attempts to register component "+r+"."),"PUBLIC"===n.type?c[r]:null;l.set(r,n),"PUBLIC"===n.type&&(e=function(e){if("function"!=typeof(e=void 0===e?u():e)[r])throw V.create("invalid-app-argument",{appName:r});return e[r]()},void 0!==n.serviceProps&&h(e,n.serviceProps),c[r]=e,a.prototype[r]=function(){for(var e=[],t=0;t>>0),i=0;function r(t,e,n){return t.call.apply(t.bind,arguments)}function g(e,n,t){if(!e)throw Error();if(2/g,Q=/"/g,tt=/'/g,et=/\x00/g,nt=/[\x00&<>"']/;function it(t,e){return-1!=t.indexOf(e)}function rt(t,e){return t"}else o=void 0===t?"undefined":null===t?"null":typeof t;D("Argument is not a %s (or a non-Element, non-Location mock); got: %s",e,o)}}function dt(t,e){this.a=t===gt&&e||"",this.b=mt}function pt(t){return t instanceof dt&&t.constructor===dt&&t.b===mt?t.a:(D("expected object of type Const, got '"+t+"'"),"type_error:Const")}dt.prototype.ta=!0,dt.prototype.sa=function(){return this.a},dt.prototype.toString=function(){return"Const{"+this.a+"}"};var vt,mt={},gt={};function bt(){if(void 0===vt){var t=null,e=l.trustedTypes;if(e&&e.createPolicy){try{t=e.createPolicy("goog#html",{createHTML:I,createScript:I,createScriptURL:I})}catch(t){l.console&&l.console.error(t.message)}vt=t}else vt=t}return vt}function yt(t,e){this.a=e===At?t:""}function wt(t){return t instanceof yt&&t.constructor===yt?t.a:(D("expected object of type TrustedResourceUrl, got '"+t+"' of type "+d(t)),"type_error:TrustedResourceUrl")}function It(t,n){var e,i=pt(t);if(!Et.test(i))throw Error("Invalid TrustedResourceUrl format: "+i);return t=i.replace(Tt,function(t,e){if(!Object.prototype.hasOwnProperty.call(n,e))throw Error('Found marker, "'+e+'", in format string, "'+i+'", but no valid label mapping found in args: '+JSON.stringify(n));return(t=n[e])instanceof dt?pt(t):encodeURIComponent(String(t))}),e=t,t=bt(),new yt(e=t?t.createScriptURL(e):e,At)}yt.prototype.ta=!0,yt.prototype.sa=function(){return this.a.toString()},yt.prototype.toString=function(){return"TrustedResourceUrl{"+this.a+"}"};var Tt=/%{(\w+)}/g,Et=/^((https:)?\/\/[0-9a-z.:[\]-]+\/|\/[^/\\]|[^:/\\%]+\/|[^:/\\%]*[?#]|about:blank#)/i,At={};function kt(t,e){this.a=e===Dt?t:""}function St(t){return t instanceof kt&&t.constructor===kt?t.a:(D("expected object of type SafeUrl, got '"+t+"' of type "+d(t)),"type_error:SafeUrl")}kt.prototype.ta=!0,kt.prototype.sa=function(){return this.a.toString()},kt.prototype.toString=function(){return"SafeUrl{"+this.a+"}"};var Nt=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|text\/csv|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,_t=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Ot=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ct(t){return t instanceof kt?t:(t="object"==typeof t&&t.ta?t.sa():String(t),t=Ot.test(t)||(e=(t=(t=String(t)).replace(/(%0A|%0D)/g,"")).match(_t))&&Nt.test(e[1])?new kt(t,Dt):null);var e}function Rt(t){return t instanceof kt?t:(t="object"==typeof t&&t.ta?t.sa():String(t),new kt(t=!Ot.test(t)?"about:invalid#zClosurez":t,Dt))}var Dt={},Pt=new kt("about:invalid#zClosurez",Dt);function Lt(t,e,n){this.a=n===xt?t:""}Lt.prototype.ta=!0,Lt.prototype.sa=function(){return this.a.toString()},Lt.prototype.toString=function(){return"SafeHtml{"+this.a+"}"};var xt={};function Mt(t,e,n,i){return t=t instanceof kt?t:Rt(t),e=e||l,n=n instanceof dt?pt(n):n||"",e.open(St(t),n,i,void 0)}function jt(t){for(var e=t.split("%s"),n="",i=Array.prototype.slice.call(arguments,1);i.length&&1")?t.replace(Z,">"):t).indexOf('"')?t.replace(Q,"""):t).indexOf("'")?t.replace(tt,"'"):t).indexOf("\0")&&(t=t.replace(et,"�"))),t}function Vt(t){return Vt[" "](t),t}Vt[" "]=a;var Ft,qt=at("Opera"),Ht=at("Trident")||at("MSIE"),Kt=at("Edge"),Gt=Kt||Ht,Bt=at("Gecko")&&!(it(J.toLowerCase(),"webkit")&&!at("Edge"))&&!(at("Trident")||at("MSIE"))&&!at("Edge"),Wt=it(J.toLowerCase(),"webkit")&&!at("Edge");function Xt(){var t=l.document;return t?t.documentMode:void 0}t:{var Jt="",Yt=(Yt=J,Bt?/rv:([^\);]+)(\)|;)/.exec(Yt):Kt?/Edge\/([\d\.]+)/.exec(Yt):Ht?/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(Yt):Wt?/WebKit\/(\S+)/.exec(Yt):qt?/(?:Version)[ \/]?(\S+)/.exec(Yt):void 0);if(Yt&&(Jt=Yt?Yt[1]:""),Ht){Yt=Xt();if(null!=Yt&&Yt>parseFloat(Jt)){Ft=String(Yt);break t}}Ft=Jt}var zt={};function $t(s){return t=s,e=function(){for(var t=0,e=Y(String(Ft)).split("."),n=Y(String(s)).split("."),i=Math.max(e.length,n.length),r=0;0==t&&r"),i=i.join("")),i=ae(n,i),r&&("string"==typeof r?i.className=r:Array.isArray(r)?i.className=r.join(" "):ee(i,r)),2>>0);function ln(e){return v(e)?e:(e[hn]||(e[hn]=function(t){return e.handleEvent(t)}),e[hn])}function fn(){Pe.call(this),this.v=new Je(this),(this.bc=this).hb=null}function dn(t,e,n,i,r){t.v.add(String(e),n,!1,i,r)}function pn(t,e,n,i,r){t.v.add(String(e),n,!0,i,r)}function vn(t,e,n,i){if(!(e=t.v.a[String(e)]))return!0;e=e.concat();for(var r=!0,o=0;o>4&15).toString(16)+(15&t).toString(16)}An.prototype.toString=function(){var t=[],e=this.c;e&&t.push(Pn(e,xn,!0),":");var n=this.a;return!n&&"file"!=e||(t.push("//"),(e=this.l)&&t.push(Pn(e,xn,!0),"@"),t.push(encodeURIComponent(String(n)).replace(/%25([0-9a-fA-F]{2})/g,"%$1")),null!=(n=this.g)&&t.push(":",String(n))),(n=this.f)&&(this.a&&"/"!=n.charAt(0)&&t.push("/"),t.push(Pn(n,"/"==n.charAt(0)?jn:Mn,!0))),(n=this.b.toString())&&t.push("?",n),(n=this.h)&&t.push("#",Pn(n,Vn)),t.join("")},An.prototype.resolve=function(t){var e=new An(this),n=!!t.c;n?kn(e,t.c):n=!!t.l,n?e.l=t.l:n=!!t.a,n?e.a=t.a:n=null!=t.g;var i=t.f;if(n)Sn(e,t.g);else if(n=!!t.f)if("/"!=i.charAt(0)&&(this.a&&!this.f?i="/"+i:-1!=(r=e.f.lastIndexOf("/"))&&(i=e.f.substr(0,r+1)+i)),".."==(r=i)||"."==r)i="";else if(it(r,"./")||it(r,"/.")){for(var i=0==r.lastIndexOf("/",0),r=r.split("/"),o=[],a=0;a2*t.c&&In(t)))}function Gn(t,e){return qn(t),e=Xn(t,e),Tn(t.a.b,e)}function Bn(t,e,n){Kn(t,e),0',t=new Lt(t=(i=bt())?i.createHTML(t):t,0,xt),i=a.document)&&(i.write((o=t)instanceof Lt&&o.constructor===Lt?o.a:(D("expected object of type SafeHtml, got '"+o+"' of type "+d(o)),"type_error:SafeHtml")),i.close())):(a=Mt(e,i,n,a))&&t.noopener&&(a.opener=null),a)try{a.focus()}catch(t){}return a}var oi=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,ai=/^[^@]+@[^@]+$/;function si(){var e=null;return new fe(function(t){"complete"==l.document.readyState?t():(e=function(){t()},en(window,"load",e))}).o(function(t){throw nn(window,"load",e),t})}function ui(t){return t=t||bi(),!("file:"!==Ei()&&"ionic:"!==Ei()||!t.toLowerCase().match(/iphone|ipad|ipod|android/))}function ci(){var t=l.window;try{return t&&t!=t.top}catch(t){return}}function hi(){return void 0!==l.WorkerGlobalScope&&"function"==typeof l.importScripts}function li(){return Zl.default.INTERNAL.hasOwnProperty("reactNative")?"ReactNative":Zl.default.INTERNAL.hasOwnProperty("node")?"Node":hi()?"Worker":"Browser"}function fi(){var t=li();return"ReactNative"===t||"Node"===t}var di="Firefox",pi="Chrome";function vi(t){var e=t.toLowerCase();return it(e,"opera/")||it(e,"opr/")||it(e,"opios/")?"Opera":it(e,"iemobile")?"IEMobile":it(e,"msie")||it(e,"trident/")?"IE":it(e,"edge/")?"Edge":it(e,"firefox/")?di:it(e,"silk/")?"Silk":it(e,"blackberry")?"Blackberry":it(e,"webos")?"Webos":!it(e,"safari/")||it(e,"chrome/")||it(e,"crios/")||it(e,"android")?!it(e,"chrome/")&&!it(e,"crios/")||it(e,"edge/")?it(e,"android")?"Android":(t=t.match(/([a-zA-Z\d\.]+)\/[a-zA-Z\d\.]*$/))&&2==t.length?t[1]:"Other":pi:"Safari"}var mi={md:"FirebaseCore-web",od:"FirebaseUI-web"};function gi(t,e){e=e||[];var n,i=[],r={};for(n in mi)r[mi[n]]=!0;for(n=0;n>4),64!=a&&(t(o<<4&240|a>>2),64!=s&&t(a<<6&192|s))}}(t,function(t){e.push(t)}),e}function Pr(t){var e=xr(t);if(!(e&&e.sub&&e.iss&&e.aud&&e.exp))throw Error("Invalid JWT");this.h=t,this.a=e.exp,this.i=e.sub,t=Date.now()/1e3,this.g=e.iat||(t>this.a?this.a:t),this.b=e.provider_id||e.firebase&&e.firebase.sign_in_provider||null,this.f=e.firebase&&e.firebase.tenant||null,this.c=!!e.is_anonymous||"anonymous"==this.b}function Lr(t){try{return new Pr(t)}catch(t){return null}}function xr(t){if(!t)return null;if(3!=(t=t.split(".")).length)return null;for(var e=(4-(t=t[1]).length%4)%4,n=0;n>10)),t[n++]=String.fromCharCode(56320+(1023&a))):(r=i[e++],o=i[e++],t[n++]=String.fromCharCode((15&s)<<12|(63&r)<<6|63&o))}return JSON.parse(t.join(""))}catch(t){}return null}Pr.prototype.T=function(){return this.f},Pr.prototype.l=function(){return this.c},Pr.prototype.toString=function(){return this.h};var Mr="oauth_consumer_key oauth_nonce oauth_signature oauth_signature_method oauth_timestamp oauth_token oauth_version".split(" "),jr=["client_id","response_type","scope","redirect_uri","state"],Ur={nd:{Ja:"locale",va:700,ua:600,fa:"facebook.com",Ya:jr},pd:{Ja:null,va:500,ua:750,fa:"github.com",Ya:jr},qd:{Ja:"hl",va:515,ua:680,fa:"google.com",Ya:jr},wd:{Ja:"lang",va:485,ua:705,fa:"twitter.com",Ya:Mr},kd:{Ja:"locale",va:640,ua:600,fa:"apple.com",Ya:[]}};function Vr(t){for(var e in Ur)if(Ur[e].fa==t)return Ur[e];return null}function Fr(t){var e={};e["facebook.com"]=Br,e["google.com"]=Xr,e["github.com"]=Wr,e["twitter.com"]=Jr;var n=t&&t[Hr];try{if(n)return new(e[n]||Gr)(t);if(void 0!==t[qr])return new Kr(t)}catch(t){}return null}var qr="idToken",Hr="providerId";function Kr(t){var e,n=t[Hr];if(n||!t[qr]||(e=Lr(t[qr]))&&e.b&&(n=e.b),!n)throw Error("Invalid additional user info!");e=!1,void 0!==t.isNewUser?e=!!t.isNewUser:"identitytoolkit#SignupNewUserResponse"===t.kind&&(e=!0),Fi(this,"providerId",n="anonymous"==n||"custom"==n?null:n),Fi(this,"isNewUser",e)}function Gr(t){Kr.call(this,t),Fi(this,"profile",Ki((t=Ni(t.rawUserInfo||"{}"))||{}))}function Br(t){if(Gr.call(this,t),"facebook.com"!=this.providerId)throw Error("Invalid provider ID!")}function Wr(t){if(Gr.call(this,t),"github.com"!=this.providerId)throw Error("Invalid provider ID!");Fi(this,"username",this.profile&&this.profile.login||null)}function Xr(t){if(Gr.call(this,t),"google.com"!=this.providerId)throw Error("Invalid provider ID!")}function Jr(t){if(Gr.call(this,t),"twitter.com"!=this.providerId)throw Error("Invalid provider ID!");Fi(this,"username",t.screenName||null)}function Yr(t){var e=On(i=Cn(t),"link"),n=On(Cn(e),"link"),i=On(i,"deep_link_id");return On(Cn(i),"link")||i||n||e||t}function zr(t,e){if(!t&&!e)throw new T("internal-error","Internal assert: no raw session string available");if(t&&e)throw new T("internal-error","Internal assert: unable to determine the session type");this.a=t||null,this.b=e||null,this.type=this.a?$r:Zr}w(Gr,Kr),w(Br,Gr),w(Wr,Gr),w(Xr,Gr),w(Jr,Gr);var $r="enroll",Zr="signin";function Qr(){}function to(t,n){return t.then(function(t){if(t[Ka]){var e=Lr(t[Ka]);if(!e||n!=e.i)throw new T("user-mismatch");return t}throw new T("user-mismatch")}).o(function(t){throw t&&t.code&&t.code==k+"user-not-found"?new T("user-mismatch"):t})}function eo(t,e){if(!e)throw new T("internal-error","failed to construct a credential");this.a=e,Fi(this,"providerId",t),Fi(this,"signInMethod",t)}function no(t){return{pendingToken:t.a,requestUri:"http://localhost"}}function io(t){if(t&&t.providerId&&t.signInMethod&&0==t.providerId.indexOf("saml.")&&t.pendingToken)try{return new eo(t.providerId,t.pendingToken)}catch(t){}return null}function ro(t,e,n){if(this.a=null,e.idToken||e.accessToken)e.idToken&&Fi(this,"idToken",e.idToken),e.accessToken&&Fi(this,"accessToken",e.accessToken),e.nonce&&!e.pendingToken&&Fi(this,"nonce",e.nonce),e.pendingToken&&(this.a=e.pendingToken);else{if(!e.oauthToken||!e.oauthTokenSecret)throw new T("internal-error","failed to construct a credential");Fi(this,"accessToken",e.oauthToken),Fi(this,"secret",e.oauthTokenSecret)}Fi(this,"providerId",t),Fi(this,"signInMethod",n)}function oo(t){var e={};return t.idToken&&(e.id_token=t.idToken),t.accessToken&&(e.access_token=t.accessToken),t.secret&&(e.oauth_token_secret=t.secret),e.providerId=t.providerId,t.nonce&&!t.a&&(e.nonce=t.nonce),e={postBody:Hn(e).toString(),requestUri:"http://localhost"},t.a&&(delete e.postBody,e.pendingToken=t.a),e}function ao(t){if(t&&t.providerId&&t.signInMethod){var e={idToken:t.oauthIdToken,accessToken:t.oauthTokenSecret?null:t.oauthAccessToken,oauthTokenSecret:t.oauthTokenSecret,oauthToken:t.oauthTokenSecret&&t.oauthAccessToken,nonce:t.nonce,pendingToken:t.pendingToken};try{return new ro(t.providerId,e,t.signInMethod)}catch(t){}}return null}function so(t,e){this.Qc=e||[],qi(this,{providerId:t,isOAuthProvider:!0}),this.Jb={},this.qb=(Vr(t)||{}).Ja||null,this.pb=null}function uo(t){if("string"!=typeof t||0!=t.indexOf("saml."))throw new T("argument-error",'SAML provider IDs must be prefixed with "saml."');so.call(this,t,[])}function co(t){so.call(this,t,jr),this.a=[]}function ho(){co.call(this,"facebook.com")}function lo(t){if(!t)throw new T("argument-error","credential failed: expected 1 argument (the OAuth access token).");var e=t;return m(t)&&(e=t.accessToken),(new ho).credential({accessToken:e})}function fo(){co.call(this,"github.com")}function po(t){if(!t)throw new T("argument-error","credential failed: expected 1 argument (the OAuth access token).");var e=t;return m(t)&&(e=t.accessToken),(new fo).credential({accessToken:e})}function vo(){co.call(this,"google.com"),this.Ca("profile")}function mo(t,e){var n=t;return m(t)&&(n=t.idToken,e=t.accessToken),(new vo).credential({idToken:n,accessToken:e})}function go(){so.call(this,"twitter.com",Mr)}function bo(t,e){var n=t;if(!(n=!m(n)?{oauthToken:t,oauthTokenSecret:e}:n).oauthToken||!n.oauthTokenSecret)throw new T("argument-error","credential failed: expected 2 arguments (the OAuth access token and secret).");return new ro("twitter.com",n,"twitter.com")}function yo(t,e,n){this.a=t,this.f=e,Fi(this,"providerId","password"),Fi(this,"signInMethod",n===Io.EMAIL_LINK_SIGN_IN_METHOD?Io.EMAIL_LINK_SIGN_IN_METHOD:Io.EMAIL_PASSWORD_SIGN_IN_METHOD)}function wo(t){return t&&t.email&&t.password?new yo(t.email,t.password,t.signInMethod):null}function Io(){qi(this,{providerId:"password",isOAuthProvider:!1})}function To(t,e){if(!(e=Eo(e)))throw new T("argument-error","Invalid email link!");return new yo(t,e.code,Io.EMAIL_LINK_SIGN_IN_METHOD)}function Eo(t){return(t=yr(t=Yr(t)))&&t.operation===Qi?t:null}function Ao(t){if(!(t.fb&&t.eb||t.La&&t.ea))throw new T("internal-error");this.a=t,Fi(this,"providerId","phone"),this.fa="phone",Fi(this,"signInMethod","phone")}function ko(e){if(e&&"phone"===e.providerId&&(e.verificationId&&e.verificationCode||e.temporaryProof&&e.phoneNumber)){var n={};return V(["verificationId","verificationCode","temporaryProof","phoneNumber"],function(t){e[t]&&(n[t]=e[t])}),new Ao(n)}return null}function So(t){return t.a.La&&t.a.ea?{temporaryProof:t.a.La,phoneNumber:t.a.ea}:{sessionInfo:t.a.fb,code:t.a.eb}}function No(t){try{this.a=t||Zl.default.auth()}catch(t){throw new T("argument-error","Either an instance of firebase.auth.Auth must be passed as an argument to the firebase.auth.PhoneAuthProvider constructor, or the default firebase App instance must be initialized via firebase.initializeApp().")}qi(this,{providerId:"phone",isOAuthProvider:!1})}function _o(t,e){if(!t)throw new T("missing-verification-id");if(!e)throw new T("missing-verification-code");return new Ao({fb:t,eb:e})}function Oo(t){if(t.temporaryProof&&t.phoneNumber)return new Ao({La:t.temporaryProof,ea:t.phoneNumber});var e=t&&t.providerId;if(!e||"password"===e)return null;var n=t&&t.oauthAccessToken,i=t&&t.oauthTokenSecret,r=t&&t.nonce,o=t&&t.oauthIdToken,a=t&&t.pendingToken;try{switch(e){case"google.com":return mo(o,n);case"facebook.com":return lo(n);case"github.com":return po(n);case"twitter.com":return bo(n,i);default:return n||i||o||a?a?0==e.indexOf("saml.")?new eo(e,a):new ro(e,{pendingToken:a,idToken:t.oauthIdToken,accessToken:t.oauthAccessToken},e):new co(e).credential({idToken:o,accessToken:n,rawNonce:r}):null}}catch(t){return null}}function Co(t){if(!t.isOAuthProvider)throw new T("invalid-oauth-provider")}function Ro(t,e,n,i,r,o,a){if(this.c=t,this.b=e||null,this.g=n||null,this.f=i||null,this.i=o||null,this.h=a||null,this.a=r||null,!this.g&&!this.a)throw new T("invalid-auth-event");if(this.g&&this.a)throw new T("invalid-auth-event");if(this.g&&!this.f)throw new T("invalid-auth-event")}function Do(t){return(t=t||{}).type?new Ro(t.type,t.eventId,t.urlResponse,t.sessionId,t.error&&E(t.error),t.postBody,t.tenantId):null}function Po(){this.b=null,this.a=[]}zr.prototype.Ha=function(){return this.a?ye(this.a):ye(this.b)},zr.prototype.w=function(){return this.type==$r?{multiFactorSession:{idToken:this.a}}:{multiFactorSession:{pendingCredential:this.b}}},Qr.prototype.ka=function(){},Qr.prototype.b=function(){},Qr.prototype.c=function(){},Qr.prototype.w=function(){},eo.prototype.ka=function(t){return ls(t,no(this))},eo.prototype.b=function(t,e){var n=no(this);return n.idToken=e,fs(t,n)},eo.prototype.c=function(t,e){return to(ds(t,no(this)),e)},eo.prototype.w=function(){return{providerId:this.providerId,signInMethod:this.signInMethod,pendingToken:this.a}},ro.prototype.ka=function(t){return ls(t,oo(this))},ro.prototype.b=function(t,e){var n=oo(this);return n.idToken=e,fs(t,n)},ro.prototype.c=function(t,e){return to(ds(t,oo(this)),e)},ro.prototype.w=function(){var t={providerId:this.providerId,signInMethod:this.signInMethod};return this.idToken&&(t.oauthIdToken=this.idToken),this.accessToken&&(t.oauthAccessToken=this.accessToken),this.secret&&(t.oauthTokenSecret=this.secret),this.nonce&&(t.nonce=this.nonce),this.a&&(t.pendingToken=this.a),t},so.prototype.Ka=function(t){return this.Jb=ct(t),this},w(uo,so),w(co,so),co.prototype.Ca=function(t){return K(this.a,t)||this.a.push(t),this},co.prototype.Rb=function(){return X(this.a)},co.prototype.credential=function(t,e){e=m(t)?{idToken:t.idToken||null,accessToken:t.accessToken||null,nonce:t.rawNonce||null}:{idToken:t||null,accessToken:e||null};if(!e.idToken&&!e.accessToken)throw new T("argument-error","credential failed: must provide the ID token and/or the access token.");return new ro(this.providerId,e,this.providerId)},w(ho,co),Fi(ho,"PROVIDER_ID","facebook.com"),Fi(ho,"FACEBOOK_SIGN_IN_METHOD","facebook.com"),w(fo,co),Fi(fo,"PROVIDER_ID","github.com"),Fi(fo,"GITHUB_SIGN_IN_METHOD","github.com"),w(vo,co),Fi(vo,"PROVIDER_ID","google.com"),Fi(vo,"GOOGLE_SIGN_IN_METHOD","google.com"),w(go,so),Fi(go,"PROVIDER_ID","twitter.com"),Fi(go,"TWITTER_SIGN_IN_METHOD","twitter.com"),yo.prototype.ka=function(t){return this.signInMethod==Io.EMAIL_LINK_SIGN_IN_METHOD?Js(t,Is,{email:this.a,oobCode:this.f}):Js(t,Ks,{email:this.a,password:this.f})},yo.prototype.b=function(t,e){return this.signInMethod==Io.EMAIL_LINK_SIGN_IN_METHOD?Js(t,Ts,{idToken:e,email:this.a,oobCode:this.f}):Js(t,xs,{idToken:e,email:this.a,password:this.f})},yo.prototype.c=function(t,e){return to(this.ka(t),e)},yo.prototype.w=function(){return{email:this.a,password:this.f,signInMethod:this.signInMethod}},qi(Io,{PROVIDER_ID:"password"}),qi(Io,{EMAIL_LINK_SIGN_IN_METHOD:"emailLink"}),qi(Io,{EMAIL_PASSWORD_SIGN_IN_METHOD:"password"}),Ao.prototype.ka=function(t){return t.gb(So(this))},Ao.prototype.b=function(t,e){var n=So(this);return n.idToken=e,Js(t,Bs,n)},Ao.prototype.c=function(t,e){var n=So(this);return n.operation="REAUTH",to(t=Js(t,Ws,n),e)},Ao.prototype.w=function(){var t={providerId:"phone"};return this.a.fb&&(t.verificationId=this.a.fb),this.a.eb&&(t.verificationCode=this.a.eb),this.a.La&&(t.temporaryProof=this.a.La),this.a.ea&&(t.phoneNumber=this.a.ea),t},No.prototype.gb=function(i,r){var o=this.a.a;return ye(r.verify()).then(function(e){if("string"!=typeof e)throw new T("argument-error","An implementation of firebase.auth.ApplicationVerifier.prototype.verify() must return a firebase.Promise that resolves with a string.");if("recaptcha"!==r.type)throw new T("argument-error",'Only firebase.auth.ApplicationVerifiers with type="recaptcha" are currently supported.');var t=m(i)?i.session:null,n=m(i)?i.phoneNumber:i,t=t&&t.type==$r?t.Ha().then(function(t){return Js(o,js,{idToken:t,phoneEnrollmentInfo:{phoneNumber:n,recaptchaToken:e}}).then(function(t){return t.phoneSessionInfo.sessionInfo})}):t&&t.type==Zr?t.Ha().then(function(t){return t={mfaPendingCredential:t,mfaEnrollmentId:i.multiFactorHint&&i.multiFactorHint.uid||i.multiFactorUid,phoneSignInInfo:{recaptchaToken:e}},Js(o,Us,t).then(function(t){return t.phoneResponseInfo.sessionInfo})}):Js(o,Ps,{phoneNumber:n,recaptchaToken:e});return t.then(function(t){return"function"==typeof r.reset&&r.reset(),t},function(t){throw"function"==typeof r.reset&&r.reset(),t})})},qi(No,{PROVIDER_ID:"phone"}),qi(No,{PHONE_SIGN_IN_METHOD:"phone"}),Ro.prototype.getUid=function(){var t=[];return t.push(this.c),this.b&&t.push(this.b),this.f&&t.push(this.f),this.h&&t.push(this.h),t.join("-")},Ro.prototype.T=function(){return this.h},Ro.prototype.w=function(){return{type:this.c,eventId:this.b,urlResponse:this.g,sessionId:this.f,postBody:this.i,tenantId:this.h,error:this.a&&this.a.w()}};var Lo,xo=null;function Mo(t){var e="unauthorized-domain",n=void 0,i=Cn(t);t=i.a,"chrome-extension"==(i=i.c)?n=jt("This chrome extension ID (chrome-extension://%s) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab.",t):"http"==i||"https"==i?n=jt("This domain (%s) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab.",t):e="operation-not-supported-in-this-environment",T.call(this,e,n)}function jo(t,e,n){T.call(this,t,n),(t=e||{}).Kb&&Fi(this,"email",t.Kb),t.ea&&Fi(this,"phoneNumber",t.ea),t.credential&&Fi(this,"credential",t.credential),t.$b&&Fi(this,"tenantId",t.$b)}function Uo(t){if(t.code){var e=t.code||"";0==e.indexOf(k)&&(e=e.substring(k.length));var n={credential:Oo(t),$b:t.tenantId};if(t.email)n.Kb=t.email;else if(t.phoneNumber)n.ea=t.phoneNumber;else if(!n.credential)return new T(e,t.message||void 0);return new jo(e,n,t.message)}return null}function Vo(){}function Fo(t){return t.c||(t.c=t.b())}function qo(){}function Ho(t){if(t.f||"undefined"!=typeof XMLHttpRequest||"undefined"==typeof ActiveXObject)return t.f;for(var e=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"],n=0;n=function t(e){return e.c||(e.a?t(e.a):(D("Root logger has no level set."),null))}(this).value)for(v(e)&&(e=e()),t=new Wo(t,String(e),this.f),n&&(t.a=n),n=this;n;)n=n.a};var Qo,ta={},ea=null;function na(t){var e,n,i;return ea||(ea=new Xo(""),(ta[""]=ea).c=$o),(e=ta[t])||(e=new Xo(t),i=t.lastIndexOf("."),n=t.substr(i+1),(i=na(t.substr(0,i))).b||(i.b={}),(i.b[n]=e).a=i,ta[t]=e),e}function ia(t,e){t&&t.log(Zo,e,void 0)}function ra(t){this.f=t}function oa(t){fn.call(this),this.u=t,this.h=void 0,this.readyState=aa,this.status=0,this.responseType=this.responseText=this.response=this.statusText="",this.onreadystatechange=null,this.l=new Headers,this.b=null,this.s="GET",this.f="",this.a=!1,this.i=na("goog.net.FetchXmlHttp"),this.m=this.c=this.g=null}w(ra,Vo),ra.prototype.a=function(){return new oa(this.f)},ra.prototype.b=(Qo={},function(){return Qo}),w(oa,fn);var aa=0;function sa(t){t.c.read().then(t.pc.bind(t)).catch(t.Va.bind(t))}function ua(t){t.readyState=4,t.g=null,t.c=null,t.m=null,ca(t)}function ca(t){t.onreadystatechange&&t.onreadystatechange.call(t)}function ha(t){fn.call(this),this.headers=new wn,this.D=t||null,this.c=!1,this.C=this.a=null,this.h=this.P=this.l="",this.f=this.N=this.i=this.J=!1,this.g=0,this.s=null,this.m=la,this.u=this.S=!1}(t=oa.prototype).open=function(t,e){if(this.readyState!=aa)throw this.abort(),Error("Error reopening a connection");this.s=t,this.f=e,this.readyState=1,ca(this)},t.send=function(t){if(1!=this.readyState)throw this.abort(),Error("need to call open() first. ");this.a=!0;var e={headers:this.l,method:this.s,credentials:this.h,cache:void 0};t&&(e.body=t),this.u.fetch(new Request(this.f,e)).then(this.uc.bind(this),this.Va.bind(this))},t.abort=function(){this.response=this.responseText="",this.l=new Headers,this.status=0,this.c&&this.c.cancel("Request was aborted."),1<=this.readyState&&this.a&&4!=this.readyState&&(this.a=!1,ua(this)),this.readyState=aa},t.uc=function(t){this.a&&(this.g=t,this.b||(this.status=this.g.status,this.statusText=this.g.statusText,this.b=t.headers,this.readyState=2,ca(this)),this.a&&(this.readyState=3,ca(this),this.a&&("arraybuffer"===this.responseType?t.arrayBuffer().then(this.sc.bind(this),this.Va.bind(this)):void 0!==l.ReadableStream&&"body"in t?(this.response=this.responseText="",this.c=t.body.getReader(),this.m=new TextDecoder,sa(this)):t.text().then(this.tc.bind(this),this.Va.bind(this)))))},t.pc=function(t){var e;this.a&&((e=this.m.decode(t.value||new Uint8Array(0),{stream:!t.done}))&&(this.response=this.responseText+=e),(t.done?ua:ca)(this),3==this.readyState&&sa(this))},t.tc=function(t){this.a&&(this.response=this.responseText=t,ua(this))},t.sc=function(t){this.a&&(this.response=t,ua(this))},t.Va=function(t){var e=this.i;e&&e.log(zo,"Failed to fetch url "+this.f,t instanceof Error?t:Error(t)),this.a&&ua(this)},t.setRequestHeader=function(t,e){this.l.append(t,e)},t.getResponseHeader=function(t){return this.b?this.b.get(t.toLowerCase())||"":((t=this.i)&&t.log(zo,"Attempting to get response header but no headers have been received for url: "+this.f,void 0),"")},t.getAllResponseHeaders=function(){if(!this.b){var t=this.i;return t&&t.log(zo,"Attempting to get all response headers but no headers have been received for url: "+this.f,void 0),""}for(var t=[],e=this.b.entries(),n=e.next();!n.done;)n=n.value,t.push(n[0]+": "+n[1]),n=e.next();return t.join("\r\n")},Object.defineProperty(oa.prototype,"withCredentials",{get:function(){return"include"===this.h},set:function(t){this.h=t?"include":"same-origin"}}),w(ha,fn);var la="";ha.prototype.b=na("goog.net.XhrIo");var fa=/^https?$/i,da=["POST","PUT"];function pa(e,t,n,i,r){if(e.a)throw Error("[goog.net.XhrIo] Object is active with another request="+e.l+"; newUri="+t);n=n?n.toUpperCase():"GET",e.l=t,e.h="",e.P=n,e.J=!1,e.c=!0,e.a=(e.D||Lo).a(),e.C=e.D?Fo(e.D):Fo(Lo),e.a.onreadystatechange=b(e.Wb,e);try{ia(e.b,Ea(e,"Opening Xhr")),e.N=!0,e.a.open(n,String(t),!0),e.N=!1}catch(t){return ia(e.b,Ea(e,"Error opening Xhr: "+t.message)),void ma(e,t)}t=i||"";var o,a=new wn(e.headers);r&&function(t,e){if(t.forEach&&"function"==typeof t.forEach)t.forEach(e,void 0);else if(p(t)||"string"==typeof t)V(t,e,void 0);else for(var n=yn(t),i=bn(t),r=i.length,o=0;o>>7|r<<25)^(r>>>18|r<<14)^r>>>3)|0,a=(0|n[e-7])+((i>>>17|i<<15)^(i>>>19|i<<13)^i>>>10)|0;n[e]=o+a|0}i=0|t.a[0],r=0|t.a[1];var s=0|t.a[2],u=0|t.a[3],c=0|t.a[4],h=0|t.a[5],l=0|t.a[6];for(o=0|t.a[7],e=0;e<64;e++){var f=((i>>>2|i<<30)^(i>>>13|i<<19)^(i>>>22|i<<10))+(i&r^i&s^r&s)|0;a=(o=o+((c>>>6|c<<26)^(c>>>11|c<<21)^(c>>>25|c<<7))|0)+((a=(a=c&h^~c&l)+(0|Zu[e])|0)+(0|n[e])|0)|0,o=l,l=h,h=c,c=u+a|0,u=s,s=r,r=i,i=a+f|0}t.a[0]=t.a[0]+i|0,t.a[1]=t.a[1]+r|0,t.a[2]=t.a[2]+s|0,t.a[3]=t.a[3]+u|0,t.a[4]=t.a[4]+c|0,t.a[5]=t.a[5]+h|0,t.a[6]=t.a[6]+l|0,t.a[7]=t.a[7]+o|0}function uc(t,e,n){void 0===n&&(n=e.length);var i=0,r=t.c;if("string"==typeof e)for(;i>r&255;return q(t,function(t){return 1<(t=t.toString(16)).length?t:"0"+t}).join("")}function vc(t,e){for(var n=0;nt.f&&(t.a=t.f),e)}function oh(t){this.f=t,this.b=this.a=null,this.c=Date.now()}function ah(t,e){void 0===e&&(e=t.b?(e=t.b).a-e.g:0),t.c=Date.now()+1e3*e}function sh(t,e){t.b=Lr(e[Ka]||""),t.a=e.refreshToken,ah(t,void 0!==(e=e.expiresIn)?Number(e):void 0)}function uh(e,t){return i=e.f,r=t,new fe(function(e,n){"refresh_token"==r.grant_type&&r.refresh_token||"authorization_code"==r.grant_type&&r.code?Za(i,i.l+"?key="+encodeURIComponent(i.c),function(t){t?t.error?n(zs(t)):t.access_token&&t.refresh_token?e(t):n(new T("internal-error")):n(new T("network-request-failed"))},"POST",Hn(r).toString(),i.g,i.m.get()):n(new T("internal-error"))}).then(function(t){return e.b=Lr(t.access_token),e.a=t.refresh_token,ah(e,t.expires_in),{accessToken:e.b.toString(),refreshToken:e.a}}).o(function(t){throw"auth/user-token-expired"==t.code&&(e.a=null),t});var i,r}function ch(t,e){this.a=t||null,this.b=e||null,qi(this,{lastSignInTime:Li(e||null),creationTime:Li(t||null)})}function hh(t,e,n,i,r,o){qi(this,{uid:t,displayName:i||null,photoURL:r||null,email:n||null,phoneNumber:o||null,providerId:e})}function lh(t,e,n){this.N=[],this.l=t.apiKey,this.m=t.appName,this.s=t.authDomain||null;var i,r=Zl.default.SDK_VERSION?gi(Zl.default.SDK_VERSION):null;this.a=new qa(this.l,_(A),r),(this.u=t.emulatorConfig||null)&&Ya(this.a,this.u),this.h=new oh(this.a),wh(this,e[Ka]),sh(this.h,e),Fi(this,"refreshToken",this.h.a),Eh(this,n||{}),fn.call(this),this.P=!1,this.s&&Ii()&&(this.b=xc(this.s,this.l,this.m,this.u)),this.W=[],this.i=null,this.D=(i=this,new ih(function(){return i.I(!0)},function(t){return!(!t||"auth/network-request-failed"!=t.code)},function(){var t=i.h.c-Date.now()-3e5;return 0this.c-3e4?this.a?uh(this,{grant_type:"refresh_token",refresh_token:this.a}):ye(null):ye({accessToken:this.b.toString(),refreshToken:this.a})},ch.prototype.w=function(){return{lastLoginAt:this.b,createdAt:this.a}},w(lh,fn),lh.prototype.xa=function(t){this.za=t,Ja(this.a,t)},lh.prototype.la=function(){return this.za},lh.prototype.Ga=function(){return X(this.aa)},lh.prototype.ib=function(){this.D.b&&(this.D.stop(),this.D.start())},Fi(lh.prototype,"providerId","firebase"),(t=lh.prototype).reload=function(){var t=this;return Vh(this,kh(this).then(function(){return Rh(t).then(function(){return Ih(t)}).then(Ah)}))},t.oc=function(t){return this.I(t).then(function(t){return new Bc(t)})},t.I=function(t){var e=this;return Vh(this,kh(this).then(function(){return e.h.getToken(t)}).then(function(t){if(!t)throw new T("internal-error");return t.accessToken!=e.Aa&&(wh(e,t.accessToken),e.dispatchEvent(new th("tokenChanged"))),Oh(e,"refreshToken",t.refreshToken),t.accessToken}))},t.Kc=function(t){if(!(t=t.users)||!t.length)throw new T("internal-error");Eh(this,{uid:(t=t[0]).localId,displayName:t.displayName,photoURL:t.photoUrl,email:t.email,emailVerified:!!t.emailVerified,phoneNumber:t.phoneNumber,lastLoginAt:t.lastLoginAt,createdAt:t.createdAt,tenantId:t.tenantId});for(var e,n=(e=(e=t).providerUserInfo)&&e.length?q(e,function(t){return new hh(t.rawId,t.providerId,t.email,t.displayName,t.photoUrl,t.phoneNumber)}):[],i=0;i=xl.length)throw new T("internal-error","Argument validator received an unsupported number of arguments.");n=xl[r],i=(i?"":n+" argument ")+(e.name?'"'+e.name+'" ':"")+"must be "+e.K+".";break t}i=null}}if(i)throw new T("argument-error",t+" failed: "+i)}(t=kl.prototype).Ia=function(){var e=this;return this.f||(this.f=Rl(this,ye().then(function(){if(Ti()&&!hi())return si();throw new T("operation-not-supported-in-this-environment","RecaptchaVerifier is only supported in a browser HTTP/HTTPS environment.")}).then(function(){return e.m.g(e.u())}).then(function(t){return e.g=t,Js(e.s,Rs,{})}).then(function(t){e.a[_l]=t.recaptchaSiteKey}).o(function(t){throw e.f=null,t})))},t.render=function(){Dl(this);var n=this;return Rl(this,this.Ia().then(function(){var t,e;return null===n.c&&(e=n.v,n.i||(t=te(e),e=oe("DIV"),t.appendChild(e)),n.c=n.g.render(e,n.a)),n.c}))},t.verify=function(){Dl(this);var r=this;return Rl(this,this.render().then(function(e){return new fe(function(n){var i,t=r.g.getResponse(e);t?n(t):(r.l.push(i=function(t){var e;t&&(e=i,B(r.l,function(t){return t==e}),n(t))}),r.i&&r.g.execute(r.c))})}))},t.reset=function(){Dl(this),null!==this.c&&this.g.reset(this.c)},t.clear=function(){Dl(this),this.J=!0,this.m.c();for(var t,e=0;es[0]&&e[1]>6|192:(55296==(64512&i)&&r+1>18|240,e[n++]=i>>12&63|128):e[n++]=i>>12|224,e[n++]=i>>6&63|128),e[n++]=63&i|128)}return e}function u(t){return function(t){t=i(t);return o.encodeByteArray(t,!0)}(t).replace(/\./g,"")}var o={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray:function(t,e){if(!Array.isArray(t))throw Error("encodeByteArray takes an array as a parameter");this.init_();for(var n=e?this.byteToCharMapWebSafe_:this.byteToCharMap_,r=[],i=0;i>6,c=63&c;u||(c=64,s||(h=64)),r.push(n[o>>2],n[(3&o)<<4|a>>4],n[h],n[c])}return r.join("")},encodeString:function(t,e){return this.HAS_NATIVE_SUPPORT&&!e?btoa(t):this.encodeByteArray(i(t),e)},decodeString:function(t,e){return this.HAS_NATIVE_SUPPORT&&!e?atob(t):function(t){for(var e=[],n=0,r=0;n>10)),e[r++]=String.fromCharCode(56320+(1023&i))):(o=t[n++],s=t[n++],e[r++]=String.fromCharCode((15&a)<<12|(63&o)<<6|63&s))}return e.join("")}(this.decodeStringToByteArray(t,e))},decodeStringToByteArray:function(t,e){this.init_();for(var n=e?this.charToByteMapWebSafe_:this.charToByteMap_,r=[],i=0;i>4),64!==a&&(r.push(s<<4&240|a>>2),64!==u&&r.push(a<<6&192|u))}return r},init_:function(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(var t=0;t=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(t)]=t,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(t)]=t)}}};function h(){return"undefined"!=typeof navigator&&"string"==typeof navigator.userAgent?navigator.userAgent:""}function c(){return!function(){try{return"[object process]"===Object.prototype.toString.call(global.process)}catch(t){return}}()&&navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome")}var l,f="FirebaseError",d=(n(p,l=Error),p);function p(t,e,n){e=l.call(this,e)||this;return e.code=t,e.customData=n,e.name=f,Object.setPrototypeOf(e,p.prototype),Error.captureStackTrace&&Error.captureStackTrace(e,m.prototype.create),e}var m=(v.prototype.create=function(t){for(var e=[],n=1;n"})):"Error",t=this.serviceName+": "+t+" ("+o+").";return new d(o,t,i)},v);function v(t,e,n){this.service=t,this.serviceName=e,this.errors=n}var w,b=/\{\$([^}]+)}/g;function E(t){return t&&t._delegate?t._delegate:t}(k=w=w||{})[k.DEBUG=0]="DEBUG",k[k.VERBOSE=1]="VERBOSE",k[k.INFO=2]="INFO",k[k.WARN=3]="WARN",k[k.ERROR=4]="ERROR",k[k.SILENT=5]="SILENT";function T(t,e){for(var n=[],r=2;r=t.length?void 0:t)&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}var k,R="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},x={},O=R||self;function L(){}function P(t){var e=typeof t;return"array"==(e="object"!=e?e:t?Array.isArray(t)?"array":e:"null")||"object"==e&&"number"==typeof t.length}function M(t){var e=typeof t;return"object"==e&&null!=t||"function"==e}var F="closure_uid_"+(1e9*Math.random()>>>0),V=0;function U(t,e,n){return t.call.apply(t.bind,arguments)}function q(e,n,t){if(!e)throw Error();if(2parseFloat(yt)){at=String(gt);break t}}at=yt}var mt={};function vt(){return t=function(){for(var t=0,e=J(String(at)).split("."),n=J("9").split("."),r=Math.max(e.length,n.length),i=0;0==t&&i>>0);function qt(e){return"function"==typeof e?e:(e[Ut]||(e[Ut]=function(t){return e.handleEvent(t)}),e[Ut])}function Bt(){G.call(this),this.i=new Nt(this),(this.P=this).I=null}function jt(t,e){var n,r=t.I;if(r)for(n=[];r;r=r.I)n.push(r);if(t=t.P,r=e.type||e,"string"==typeof e?e=new Et(e,t):e instanceof Et?e.target=e.target||t:(s=e,ot(e=new Et(r,t),s)),s=!0,n)for(var i=n.length-1;0<=i;i--)var o=e.g=n[i],s=Kt(o,r,!0,e)&&s;if(s=Kt(o=e.g=t,r,!0,e)&&s,s=Kt(o,r,!1,e)&&s,n)for(i=0;io.length?Pe:(o=o.substr(a,s),i.C=a+s,o)))==Pe){4==e&&(t.o=4,be(14),u=!1),de(t.j,t.m,null,"[Incomplete Response]");break}if(r==Le){t.o=4,be(15),de(t.j,t.m,n,"[Invalid Chunk]"),u=!1;break}de(t.j,t.m,r,null),Qe(t,r)}Ve(t)&&r!=Pe&&r!=Le&&(t.h.g="",t.C=0),4!=e||0!=n.length||t.h.h||(t.o=1,be(16),u=!1),t.i=t.i&&u,u?0>4&15).toString(16)+(15&t).toString(16)}$e.prototype.toString=function(){var t=[],e=this.j;e&&t.push(an(e,cn,!0),":");var n=this.i;return!n&&"file"!=e||(t.push("//"),(e=this.s)&&t.push(an(e,cn,!0),"@"),t.push(encodeURIComponent(String(n)).replace(/%25([0-9a-fA-F]{2})/g,"%$1")),null!=(n=this.m)&&t.push(":",String(n))),(n=this.l)&&(this.i&&"/"!=n.charAt(0)&&t.push("/"),t.push(an(n,"/"==n.charAt(0)?ln:hn,!0))),(n=this.h.toString())&&t.push("?",n),(n=this.o)&&t.push("#",an(n,dn)),t.join("")};var cn=/[#\/\?@]/g,hn=/[#\?:]/g,ln=/[#\?]/g,fn=/[#\?@]/g,dn=/#/g;function pn(t,e){this.h=this.g=null,this.i=t||null,this.j=!!e}function yn(n){n.g||(n.g=new ze,n.h=0,n.i&&function(t,e){if(t){t=t.split("&");for(var n=0;n2*t.i&&We(t)))}function mn(t,e){return yn(t),e=wn(t,e),Ye(t.g.h,e)}function vn(t,e,n){gn(t,e),0=t.j}function Sn(t){return t.h?1:t.g?t.g.size:0}function An(t,e){return t.h?t.h==e:t.g&&t.g.has(e)}function Dn(t,e){t.g?t.g.add(e):t.h=e}function Nn(t,e){t.h&&t.h==e?t.h=null:t.g&&t.g.has(e)&&t.g.delete(e)}function Cn(t){var e,n;if(null!=t.h)return t.i.concat(t.h.D);if(null==t.g||0===t.g.size)return Y(t.i);var r=t.i;try{for(var i=C(t.g.values()),o=i.next();!o.done;o=i.next())var s=o.value,r=r.concat(s.D)}catch(t){e={error:t}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}return r}function kn(){}function Rn(){this.g=new kn}function xn(t,e,n,r,i){try{e.onload=null,e.onerror=null,e.onabort=null,e.ontimeout=null,i(r)}catch(t){}}function On(t){this.l=t.$b||null,this.j=t.ib||!1}function Ln(t,e){Bt.call(this),this.D=t,this.u=e,this.m=void 0,this.readyState=Pn,this.status=0,this.responseType=this.responseText=this.response=this.statusText="",this.onreadystatechange=null,this.v=new Headers,this.h=null,this.C="GET",this.B="",this.g=!1,this.A=this.j=this.l=null}En.prototype.cancel=function(){var e,t;if(this.i=Cn(this),this.h)this.h.cancel(),this.h=null;else if(this.g&&0!==this.g.size){try{for(var n=C(this.g.values()),r=n.next();!r.done;r=n.next())r.value.cancel()}catch(t){e={error:t}}finally{try{r&&!r.done&&(t=n.return)&&t.call(n)}finally{if(e)throw e.error}}this.g.clear()}},kn.prototype.stringify=function(t){return O.JSON.stringify(t,void 0)},kn.prototype.parse=function(t){return O.JSON.parse(t,void 0)},K(On,_e),On.prototype.g=function(){return new Ln(this.l,this.j)},On.prototype.i=(Tn={},function(){return Tn}),K(Ln,Bt);var Pn=0;function Mn(t){t.j.read().then(t.Sa.bind(t)).catch(t.ha.bind(t))}function Fn(t){t.readyState=4,t.l=null,t.j=null,t.A=null,Vn(t)}function Vn(t){t.onreadystatechange&&t.onreadystatechange.call(t)}(k=Ln.prototype).open=function(t,e){if(this.readyState!=Pn)throw this.abort(),Error("Error reopening a connection");this.C=t,this.B=e,this.readyState=1,Vn(this)},k.send=function(t){if(1!=this.readyState)throw this.abort(),Error("need to call open() first. ");this.g=!0;var e={headers:this.v,method:this.C,credentials:this.m,cache:void 0};t&&(e.body=t),(this.D||O).fetch(new Request(this.B,e)).then(this.Va.bind(this),this.ha.bind(this))},k.abort=function(){this.response=this.responseText="",this.v=new Headers,this.status=0,this.j&&this.j.cancel("Request was aborted."),1<=this.readyState&&this.g&&4!=this.readyState&&(this.g=!1,Fn(this)),this.readyState=Pn},k.Va=function(t){if(this.g&&(this.l=t,this.h||(this.status=this.l.status,this.statusText=this.l.statusText,this.h=t.headers,this.readyState=2,Vn(this)),this.g&&(this.readyState=3,Vn(this),this.g)))if("arraybuffer"===this.responseType)t.arrayBuffer().then(this.Ta.bind(this),this.ha.bind(this));else if(void 0!==O.ReadableStream&&"body"in t){if(this.j=t.body.getReader(),this.u){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.response=[]}else this.response=this.responseText="",this.A=new TextDecoder;Mn(this)}else t.text().then(this.Ua.bind(this),this.ha.bind(this))},k.Sa=function(t){var e;this.g&&(this.u&&t.value?this.response.push(t.value):this.u||(e=t.value||new Uint8Array(0),(e=this.A.decode(e,{stream:!t.done}))&&(this.response=this.responseText+=e)),(t.done?Fn:Vn)(this),3==this.readyState&&Mn(this))},k.Ua=function(t){this.g&&(this.response=this.responseText=t,Fn(this))},k.Ta=function(t){this.g&&(this.response=t,Fn(this))},k.ha=function(){this.g&&Fn(this)},k.setRequestHeader=function(t,e){this.v.append(t,e)},k.getResponseHeader=function(t){return this.h&&this.h.get(t.toLowerCase())||""},k.getAllResponseHeaders=function(){if(!this.h)return"";for(var t=[],e=this.h.entries(),n=e.next();!n.done;)n=n.value,t.push(n[0]+": "+n[1]),n=e.next();return t.join("\r\n")},Object.defineProperty(Ln.prototype,"withCredentials",{get:function(){return"include"===this.m},set:function(t){this.m=t?"include":"same-origin"}});var Un=O.JSON.parse;function qn(t){Bt.call(this),this.headers=new ze,this.u=t||null,this.h=!1,this.C=this.g=null,this.H="",this.m=0,this.j="",this.l=this.F=this.v=this.D=!1,this.B=0,this.A=null,this.J=Bn,this.K=this.L=!1}K(qn,Bt);var Bn="",jn=/^https?$/i,Kn=["POST","PUT"];function Gn(t){return"content-type"==t.toLowerCase()}function Qn(t,e){t.h=!1,t.g&&(t.l=!0,t.g.abort(),t.l=!1),t.j=e,t.m=5,Hn(t),Wn(t)}function Hn(t){t.D||(t.D=!0,jt(t,"complete"),jt(t,"error"))}function zn(t){if(t.h&&void 0!==x&&(!t.C[1]||4!=Xn(t)||2!=t.ba()))if(t.v&&4==Xn(t))ie(t.Fa,0,t);else if(jt(t,"readystatechange"),4==Xn(t)){t.h=!1;try{var e,n,r,i,o=t.ba();t:switch(o){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var s=!0;break t;default:s=!1}if((e=s)||((n=0===o)&&(!(i=String(t.H).match(Xe)[1]||null)&&O.self&&O.self.location&&(i=(r=O.self.location.protocol).substr(0,r.length-1)),n=!jn.test(i?i.toLowerCase():"")),e=n),e)jt(t,"complete"),jt(t,"success");else{t.m=6;try{var a=2=r.i.j-(r.m?1:0)||(r.m?(r.l=i.D.concat(r.l),0):1==r.G||2==r.G||r.C>=(r.Xa?0:r.Ya)||(r.m=Te(B(r.Ha,r,i),yr(r,r.C)),r.C++,0))))&&(2!=s||!hr(t)))switch(o&&0e.length?1:0},vi),ci=(n(mi,ui=R),mi.prototype.construct=function(t,e,n){return new mi(t,e,n)},mi.prototype.canonicalString=function(){return this.toArray().join("/")},mi.prototype.toString=function(){return this.canonicalString()},mi.fromString=function(){for(var t=[],e=0;et.length&&zr(),void 0===n?n=t.length-e:n>t.length-e&&zr(),this.segments=t,this.offset=e,this.len=n}di.EMPTY_BYTE_STRING=new di("");var wi=new RegExp(/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(?:\.(\d+))?Z$/);function bi(t){if(Wr(!!t),"string"!=typeof t)return{seconds:Ei(t.seconds),nanos:Ei(t.nanos)};var e=0,n=wi.exec(t);Wr(!!n),n[1]&&(n=((n=n[1])+"000000000").substr(0,9),e=Number(n));t=new Date(t);return{seconds:Math.floor(t.getTime()/1e3),nanos:e}}function Ei(t){return"number"==typeof t?t:"string"==typeof t?Number(t):0}function Ti(t){return"string"==typeof t?di.fromBase64String(t):di.fromUint8Array(t)}function Ii(t){return"server_timestamp"===(null===(t=((null===(t=null==t?void 0:t.mapValue)||void 0===t?void 0:t.fields)||{}).__type__)||void 0===t?void 0:t.stringValue)}function _i(t){t=bi(t.mapValue.fields.__local_write_time__.timestampValue);return new ti(t.seconds,t.nanos)}function Si(t){return null==t}function Ai(t){return 0===t&&1/t==-1/0}function Di(t){return"number"==typeof t&&Number.isInteger(t)&&!Ai(t)&&t<=Number.MAX_SAFE_INTEGER&&t>=Number.MIN_SAFE_INTEGER}var Ni=(Ci.fromPath=function(t){return new Ci(ci.fromString(t))},Ci.fromName=function(t){return new Ci(ci.fromString(t).popFirst(5))},Ci.prototype.hasCollectionId=function(t){return 2<=this.path.length&&this.path.get(this.path.length-2)===t},Ci.prototype.isEqual=function(t){return null!==t&&0===ci.comparator(this.path,t.path)},Ci.prototype.toString=function(){return this.path.toString()},Ci.comparator=function(t,e){return ci.comparator(t.path,e.path)},Ci.isDocumentKey=function(t){return t.length%2==0},Ci.fromSegments=function(t){return new Ci(new ci(t.slice()))},Ci);function Ci(t){this.path=t}function ki(t){return"nullValue"in t?0:"booleanValue"in t?1:"integerValue"in t||"doubleValue"in t?2:"timestampValue"in t?3:"stringValue"in t?5:"bytesValue"in t?6:"referenceValue"in t?7:"geoPointValue"in t?8:"arrayValue"in t?9:"mapValue"in t?Ii(t)?4:10:zr()}function Ri(r,i){var t,e,n=ki(r);if(n!==ki(i))return!1;switch(n){case 0:return!0;case 1:return r.booleanValue===i.booleanValue;case 4:return _i(r).isEqual(_i(i));case 3:return function(t){if("string"==typeof r.timestampValue&&"string"==typeof t.timestampValue&&r.timestampValue.length===t.timestampValue.length)return r.timestampValue===t.timestampValue;var e=bi(r.timestampValue),t=bi(t.timestampValue);return e.seconds===t.seconds&&e.nanos===t.nanos}(i);case 5:return r.stringValue===i.stringValue;case 6:return e=i,Ti(r.bytesValue).isEqual(Ti(e.bytesValue));case 7:return r.referenceValue===i.referenceValue;case 8:return t=i,Ei((e=r).geoPointValue.latitude)===Ei(t.geoPointValue.latitude)&&Ei(e.geoPointValue.longitude)===Ei(t.geoPointValue.longitude);case 2:return function(t,e){if("integerValue"in t&&"integerValue"in e)return Ei(t.integerValue)===Ei(e.integerValue);if("doubleValue"in t&&"doubleValue"in e){t=Ei(t.doubleValue),e=Ei(e.doubleValue);return t===e?Ai(t)===Ai(e):isNaN(t)&&isNaN(e)}return!1}(r,i);case 9:return Jr(r.arrayValue.values||[],i.arrayValue.values||[],Ri);case 10:return function(){var t,e=r.mapValue.fields||{},n=i.mapValue.fields||{};if(ii(e)!==ii(n))return!1;for(t in e)if(e.hasOwnProperty(t)&&(void 0===n[t]||!Ri(e[t],n[t])))return!1;return!0}();default:return zr()}}function xi(t,e){return void 0!==(t.values||[]).find(function(t){return Ri(t,e)})}function Oi(t,e){var n,r,i,o=ki(t),s=ki(e);if(o!==s)return $r(o,s);switch(o){case 0:return 0;case 1:return $r(t.booleanValue,e.booleanValue);case 2:return r=e,i=Ei(t.integerValue||t.doubleValue),r=Ei(r.integerValue||r.doubleValue),i":return 0=":return 0<=t;default:return zr()}},to.prototype.g=function(){return 0<=["<","<=",">",">=","!=","not-in"].indexOf(this.op)},to);function to(t,e,n){var r=this;return(r=Ji.call(this)||this).field=t,r.op=e,r.value=n,r}var eo,no,ro,io=(n(co,ro=Zi),co.prototype.matches=function(t){t=Ni.comparator(t.key,this.key);return this.m(t)},co),oo=(n(uo,no=Zi),uo.prototype.matches=function(e){return this.keys.some(function(t){return t.isEqual(e.key)})},uo),so=(n(ao,eo=Zi),ao.prototype.matches=function(e){return!this.keys.some(function(t){return t.isEqual(e.key)})},ao);function ao(t,e){var n=this;return(n=eo.call(this,t,"not-in",e)||this).keys=ho(0,e),n}function uo(t,e){var n=this;return(n=no.call(this,t,"in",e)||this).keys=ho(0,e),n}function co(t,e,n){var r=this;return(r=ro.call(this,t,e,n)||this).key=Ni.fromName(n.referenceValue),r}function ho(t,e){return((null===(e=e.arrayValue)||void 0===e?void 0:e.values)||[]).map(function(t){return Ni.fromName(t.referenceValue)})}var lo,fo,po,yo,go=(n(_o,yo=Zi),_o.prototype.matches=function(t){t=t.data.field(this.field);return Vi(t)&&xi(t.arrayValue,this.value)},_o),mo=(n(Io,po=Zi),Io.prototype.matches=function(t){t=t.data.field(this.field);return null!==t&&xi(this.value.arrayValue,t)},Io),vo=(n(To,fo=Zi),To.prototype.matches=function(t){if(xi(this.value.arrayValue,{nullValue:"NULL_VALUE"}))return!1;t=t.data.field(this.field);return null!==t&&!xi(this.value.arrayValue,t)},To),wo=(n(Eo,lo=Zi),Eo.prototype.matches=function(t){var e=this,t=t.data.field(this.field);return!(!Vi(t)||!t.arrayValue.values)&&t.arrayValue.values.some(function(t){return xi(e.value.arrayValue,t)})},Eo),bo=function(t,e){this.position=t,this.before=e};function Eo(t,e){return lo.call(this,t,"array-contains-any",e)||this}function To(t,e){return fo.call(this,t,"not-in",e)||this}function Io(t,e){return po.call(this,t,"in",e)||this}function _o(t,e){return yo.call(this,t,"array-contains",e)||this}function So(t){return(t.before?"b":"a")+":"+t.position.map(Pi).join(",")}var Ao=function(t,e){void 0===e&&(e="asc"),this.field=t,this.dir=e};function Do(t,e,n){for(var r=0,i=0;i":"GREATER_THAN",">=":"GREATER_THAN_OR_EQUAL","==":"EQUAL","!=":"NOT_EQUAL","array-contains":"ARRAY_CONTAINS",in:"IN","not-in":"NOT_IN","array-contains-any":"ARRAY_CONTAINS_ANY"},ga=function(t,e){this.databaseId=t,this.I=e};function ma(t,e){return t.I?new Date(1e3*e.seconds).toISOString().replace(/\.\d*/,"").replace("Z","")+"."+("000000000"+e.nanoseconds).slice(-9)+"Z":{seconds:""+e.seconds,nanos:e.nanoseconds}}function va(t,e){return t.I?e.toBase64():e.toUint8Array()}function wa(t){return Wr(!!t),ei.fromTimestamp((t=bi(t),new ti(t.seconds,t.nanos)))}function ba(t,e){return new ci(["projects",t.projectId,"databases",t.database]).child("documents").child(e).canonicalString()}function Ea(t){t=ci.fromString(t);return Wr(Ba(t)),t}function Ta(t,e){return ba(t.databaseId,e.path)}function Ia(t,e){e=Ea(e);if(e.get(1)!==t.databaseId.projectId)throw new Ur(Vr.INVALID_ARGUMENT,"Tried to deserialize key from different project: "+e.get(1)+" vs "+t.databaseId.projectId);if(e.get(3)!==t.databaseId.database)throw new Ur(Vr.INVALID_ARGUMENT,"Tried to deserialize key from different database: "+e.get(3)+" vs "+t.databaseId.database);return new Ni(Da(e))}function _a(t,e){return ba(t.databaseId,e)}function Sa(t){t=Ea(t);return 4===t.length?ci.emptyPath():Da(t)}function Aa(t){return new ci(["projects",t.databaseId.projectId,"databases",t.databaseId.database]).canonicalString()}function Da(t){return Wr(4";case"GREATER_THAN_OR_EQUAL":return">=";case"LESS_THAN":return"<";case"LESS_THAN_OR_EQUAL":return"<=";case"ARRAY_CONTAINS":return"array-contains";case"IN":return"in";case"NOT_IN":return"not-in";case"ARRAY_CONTAINS_ANY":return"array-contains-any";case"OPERATOR_UNSPECIFIED":default:return zr()}}(),t.fieldFilter.value)}function qa(t){switch(t.unaryFilter.op){case"IS_NAN":var e=Va(t.unaryFilter.field);return Zi.create(e,"==",{doubleValue:NaN});case"IS_NULL":e=Va(t.unaryFilter.field);return Zi.create(e,"==",{nullValue:"NULL_VALUE"});case"IS_NOT_NAN":var n=Va(t.unaryFilter.field);return Zi.create(n,"!=",{doubleValue:NaN});case"IS_NOT_NULL":n=Va(t.unaryFilter.field);return Zi.create(n,"!=",{nullValue:"NULL_VALUE"});case"OPERATOR_UNSPECIFIED":default:return zr()}}function Ba(t){return 4<=t.length&&"projects"===t.get(0)&&"databases"===t.get(2)}function ja(t){for(var e="",n=0;n",t),this.store.put(t));return Au(t)},Su.prototype.add=function(t){return Kr("SimpleDb","ADD",this.store.name,t,t),Au(this.store.add(t))},Su.prototype.get=function(e){var n=this;return Au(this.store.get(e)).next(function(t){return Kr("SimpleDb","GET",n.store.name,e,t=void 0===t?null:t),t})},Su.prototype.delete=function(t){return Kr("SimpleDb","DELETE",this.store.name,t),Au(this.store.delete(t))},Su.prototype.count=function(){return Kr("SimpleDb","COUNT",this.store.name),Au(this.store.count())},Su.prototype.Nt=function(t,e){var e=this.cursor(this.options(t,e)),n=[];return this.xt(e,function(t,e){n.push(e)}).next(function(){return n})},Su.prototype.kt=function(t,e){Kr("SimpleDb","DELETE ALL",this.store.name);e=this.options(t,e);e.Ft=!1;e=this.cursor(e);return this.xt(e,function(t,e,n){return n.delete()})},Su.prototype.$t=function(t,e){e?n=t:(n={},e=t);var n=this.cursor(n);return this.xt(n,e)},Su.prototype.Ot=function(r){var t=this.cursor({});return new fu(function(n,e){t.onerror=function(t){t=Nu(t.target.error);e(t)},t.onsuccess=function(t){var e=t.target.result;e?r(e.primaryKey,e.value).next(function(t){t?e.continue():n()}):n()}})},Su.prototype.xt=function(t,i){var o=[];return new fu(function(r,e){t.onerror=function(t){e(t.target.error)},t.onsuccess=function(t){var e,n=t.target.result;n?(e=new yu(n),(t=i(n.primaryKey,n.value,e))instanceof fu&&(t=t.catch(function(t){return e.done(),fu.reject(t)}),o.push(t)),e.isDone?r():null===e.Dt?n.continue():n.continue(e.Dt)):r()}}).next(function(){return fu.waitFor(o)})},Su.prototype.options=function(t,e){var n;return void 0!==t&&("string"==typeof t?n=t:e=t),{index:n,range:e}},Su.prototype.cursor=function(t){var e="next";if(t.reverse&&(e="prev"),t.index){var n=this.store.index(t.index);return t.Ft?n.openKeyCursor(t.range,e):n.openCursor(t.range,e)}return this.store.openCursor(t.range,e)},Su);function Su(t){this.store=t}function Au(t){return new fu(function(e,n){t.onsuccess=function(t){t=t.target.result;e(t)},t.onerror=function(t){t=Nu(t.target.error);n(t)}})}var Du=!1;function Nu(t){var e=pu._t(h());if(12.2<=e&&e<13){e="An internal error was encountered in the Indexed Database server";if(0<=t.message.indexOf(e)){var n=new Ur("internal","IOS_INDEXEDDB_BUG1: IndexedDb has thrown '"+e+"'. This is likely due to an unavoidable bug in iOS. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.");return Du||(Du=!0,setTimeout(function(){throw n},0)),n}}return t}var Cu,ku=(n(Ru,Cu=R),Ru);function Ru(t,e){var n=this;return(n=Cu.call(this)||this).Mt=t,n.currentSequenceNumber=e,n}function xu(t,e){return pu.It(t.Mt,e)}var Ou=(Uu.prototype.applyToRemoteDocument=function(t,e){for(var n,r,i,o,s,a,u=e.mutationResults,c=0;c=i),o=Hu(r.R,e)),n.done()}).next(function(){return o})},dc.prototype.getHighestUnacknowledgedBatchId=function(t){var e=IDBKeyRange.upperBound([this.userId,Number.POSITIVE_INFINITY]),r=-1;return yc(t).$t({index:Wa.userMutationsIndex,range:e,reverse:!0},function(t,e,n){r=e.batchId,n.done()}).next(function(){return r})},dc.prototype.getAllMutationBatches=function(t){var e=this,n=IDBKeyRange.bound([this.userId,-1],[this.userId,Number.POSITIVE_INFINITY]);return yc(t).Nt(Wa.userMutationsIndex,n).next(function(t){return t.map(function(t){return Hu(e.R,t)})})},dc.prototype.getAllMutationBatchesAffectingDocumentKey=function(o,s){var a=this,t=Ya.prefixForPath(this.userId,s.path),t=IDBKeyRange.lowerBound(t),u=[];return gc(o).$t({range:t},function(t,e,n){var r=t[0],i=t[1],t=t[2],i=Ga(i);if(r===a.userId&&s.path.isEqual(i))return yc(o).get(t).next(function(t){if(!t)throw zr();Wr(t.userId===a.userId),u.push(Hu(a.R,t))});n.done()}).next(function(){return u})},dc.prototype.getAllMutationBatchesAffectingDocumentKeys=function(e,t){var s=this,a=new Qs($r),n=[];return t.forEach(function(o){var t=Ya.prefixForPath(s.userId,o.path),t=IDBKeyRange.lowerBound(t),t=gc(e).$t({range:t},function(t,e,n){var r=t[0],i=t[1],t=t[2],i=Ga(i);r===s.userId&&o.path.isEqual(i)?a=a.add(t):n.done()});n.push(t)}),fu.waitFor(n).next(function(){return s.Wt(e,a)})},dc.prototype.getAllMutationBatchesAffectingQuery=function(t,e){var o=this,s=e.path,a=s.length+1,e=Ya.prefixForPath(this.userId,s),e=IDBKeyRange.lowerBound(e),u=new Qs($r);return gc(t).$t({range:e},function(t,e,n){var r=t[0],i=t[1],t=t[2],i=Ga(i);r===o.userId&&s.isPrefixOf(i)?i.length===a&&(u=u.add(t)):n.done()}).next(function(){return o.Wt(t,u)})},dc.prototype.Wt=function(e,t){var n=this,r=[],i=[];return t.forEach(function(t){i.push(yc(e).get(t).next(function(t){if(null===t)throw zr();Wr(t.userId===n.userId),r.push(Hu(n.R,t))}))}),fu.waitFor(i).next(function(){return r})},dc.prototype.removeMutationBatch=function(e,n){var r=this;return hc(e.Mt,this.userId,n).next(function(t){return e.addOnCommittedListener(function(){r.Gt(n.batchId)}),fu.forEach(t,function(t){return r.referenceDelegate.markPotentiallyOrphaned(e,t)})})},dc.prototype.Gt=function(t){delete this.Kt[t]},dc.prototype.performConsistencyCheck=function(e){var i=this;return this.checkEmpty(e).next(function(t){if(!t)return fu.resolve();var t=IDBKeyRange.lowerBound(Ya.prefixForUser(i.userId)),r=[];return gc(e).$t({range:t},function(t,e,n){t[0]===i.userId?(t=Ga(t[1]),r.push(t)):n.done()}).next(function(){Wr(0===r.length)})})},dc.prototype.containsKey=function(t,e){return pc(t,this.userId,e)},dc.prototype.zt=function(t){var e=this;return mc(t).get(this.userId).next(function(t){return t||new za(e.userId,-1,"")})},dc);function dc(t,e,n,r){this.userId=t,this.R=e,this.Ut=n,this.referenceDelegate=r,this.Kt={}}function pc(t,o,e){var e=Ya.prefixForPath(o,e.path),s=e[1],e=IDBKeyRange.lowerBound(e),a=!1;return gc(t).$t({range:e,Ft:!0},function(t,e,n){var r=t[0],i=t[1];t[2],r===o&&i===s&&(a=!0),n.done()}).next(function(){return a})}function yc(t){return xu(t,Wa.store)}function gc(t){return xu(t,Ya.store)}function mc(t){return xu(t,za.store)}var vc=(Ec.prototype.next=function(){return this.Ht+=2,this.Ht},Ec.Jt=function(){return new Ec(0)},Ec.Yt=function(){return new Ec(-1)},Ec),wc=(bc.prototype.allocateTargetId=function(n){var r=this;return this.Xt(n).next(function(t){var e=new vc(t.highestTargetId);return t.highestTargetId=e.next(),r.Zt(n,t).next(function(){return t.highestTargetId})})},bc.prototype.getLastRemoteSnapshotVersion=function(t){return this.Xt(t).next(function(t){return ei.fromTimestamp(new ti(t.lastRemoteSnapshotVersion.seconds,t.lastRemoteSnapshotVersion.nanoseconds))})},bc.prototype.getHighestSequenceNumber=function(t){return this.Xt(t).next(function(t){return t.highestListenSequenceNumber})},bc.prototype.setTargetsMetadata=function(e,n,r){var i=this;return this.Xt(e).next(function(t){return t.highestListenSequenceNumber=n,r&&(t.lastRemoteSnapshotVersion=r.toTimestamp()),n>t.highestListenSequenceNumber&&(t.highestListenSequenceNumber=n),i.Zt(e,t)})},bc.prototype.addTargetData=function(e,n){var r=this;return this.te(e,n).next(function(){return r.Xt(e).next(function(t){return t.targetCount+=1,r.ee(n,t),r.Zt(e,t)})})},bc.prototype.updateTargetData=function(t,e){return this.te(t,e)},bc.prototype.removeTargetData=function(e,t){var n=this;return this.removeMatchingKeysForTargetId(e,t.targetId).next(function(){return Tc(e).delete(t.targetId)}).next(function(){return n.Xt(e)}).next(function(t){return Wr(0e.highestTargetId&&(e.highestTargetId=t.targetId,n=!0),t.sequenceNumber>e.highestListenSequenceNumber&&(e.highestListenSequenceNumber=t.sequenceNumber,n=!0),n},bc.prototype.getTargetCount=function(t){return this.Xt(t).next(function(t){return t.targetCount})},bc.prototype.getTargetData=function(t,r){var e=Yi(r),e=IDBKeyRange.bound([e,Number.NEGATIVE_INFINITY],[e,Number.POSITIVE_INFINITY]),i=null;return Tc(t).$t({range:e,index:eu.queryTargetsIndexName},function(t,e,n){e=zu(e);Xi(r,e.target)&&(i=e,n.done())}).next(function(){return i})},bc.prototype.addMatchingKeys=function(n,t,r){var i=this,o=[],s=_c(n);return t.forEach(function(t){var e=ja(t.path);o.push(s.put(new nu(r,e))),o.push(i.referenceDelegate.addReference(n,r,t))}),fu.waitFor(o)},bc.prototype.removeMatchingKeys=function(n,t,r){var i=this,o=_c(n);return fu.forEach(t,function(t){var e=ja(t.path);return fu.waitFor([o.delete([r,e]),i.referenceDelegate.removeReference(n,r,t)])})},bc.prototype.removeMatchingKeysForTargetId=function(t,e){t=_c(t),e=IDBKeyRange.bound([e],[e+1],!1,!0);return t.delete(e)},bc.prototype.getMatchingKeysForTargetId=function(t,e){var e=IDBKeyRange.bound([e],[e+1],!1,!0),t=_c(t),r=Zs();return t.$t({range:e,Ft:!0},function(t,e,n){t=Ga(t[1]),t=new Ni(t);r=r.add(t)}).next(function(){return r})},bc.prototype.containsKey=function(t,e){var e=ja(e.path),e=IDBKeyRange.bound([e],[Zr(e)],!1,!0),i=0;return _c(t).$t({index:nu.documentTargetsIndex,Ft:!0,range:e},function(t,e,n){var r=t[0];t[1],0!==r&&(i++,n.done())}).next(function(){return 0h.params.maximumSequenceNumbersToCollect?(Kr("LruGarbageCollector","Capping sequence numbers to collect down to the maximum of "+h.params.maximumSequenceNumbersToCollect+" from "+t),h.params.maximumSequenceNumbersToCollect):t,s=Date.now(),h.nthSequenceNumber(e,i)}).next(function(t){return r=t,a=Date.now(),h.removeTargets(e,r,n)}).next(function(t){return o=t,u=Date.now(),h.removeOrphanedDocuments(e,r)}).next(function(t){return c=Date.now(),jr()<=w.DEBUG&&Kr("LruGarbageCollector","LRU Garbage Collection\n\tCounted targets in "+(s-l)+"ms\n\tDetermined least recently used "+i+" in "+(a-s)+"ms\n\tRemoved "+o+" targets in "+(u-a)+"ms\n\tRemoved "+t+" documents in "+(c-u)+"ms\nTotal Duration: "+(c-l)+"ms"),fu.resolve({didRun:!0,sequenceNumbersCollected:i,targetsRemoved:o,documentsRemoved:t})})},xc),kc=(Rc.prototype.he=function(t){var n=this.de(t);return this.db.getTargetCache().getTargetCount(t).next(function(e){return n.next(function(t){return e+t})})},Rc.prototype.de=function(t){var e=0;return this.le(t,function(t){e++}).next(function(){return e})},Rc.prototype.forEachTarget=function(t,e){return this.db.getTargetCache().forEachTarget(t,e)},Rc.prototype.le=function(t,n){return this.we(t,function(t,e){return n(e)})},Rc.prototype.addReference=function(t,e,n){return Pc(t,n)},Rc.prototype.removeReference=function(t,e,n){return Pc(t,n)},Rc.prototype.removeTargets=function(t,e,n){return this.db.getTargetCache().removeTargets(t,e,n)},Rc.prototype.markPotentiallyOrphaned=Pc,Rc.prototype._e=function(t,e){return r=e,i=!1,mc(n=t).Ot(function(t){return pc(n,t,r).next(function(t){return t&&(i=!0),fu.resolve(!t)})}).next(function(){return i});var n,r,i},Rc.prototype.removeOrphanedDocuments=function(n,r){var i=this,o=this.db.getRemoteDocumentCache().newChangeBuffer(),s=[],a=0;return this.we(n,function(e,t){t<=r&&(t=i._e(n,e).next(function(t){if(!t)return a++,o.getEntry(n,e).next(function(){return o.removeEntry(e),_c(n).delete([0,ja(e.path)])})}),s.push(t))}).next(function(){return fu.waitFor(s)}).next(function(){return o.apply(n)}).next(function(){return a})},Rc.prototype.removeTarget=function(t,e){e=e.withSequenceNumber(t.currentSequenceNumber);return this.db.getTargetCache().updateTargetData(t,e)},Rc.prototype.updateLimboDocument=Pc,Rc.prototype.we=function(t,r){var i,t=_c(t),o=Pr.o;return t.$t({index:nu.documentTargetsIndex},function(t,e){var n=t[0];t[1];t=e.path,e=e.sequenceNumber;0===n?(o!==Pr.o&&r(new Ni(Ga(i)),o),o=e,i=t):o=Pr.o}).next(function(){o!==Pr.o&&r(new Ni(Ga(i)),o)})},Rc.prototype.getCacheSize=function(t){return this.db.getRemoteDocumentCache().getSize(t)},Rc);function Rc(t,e){this.db=t,this.garbageCollector=new Cc(this,e)}function xc(t,e){this.ae=t,this.params=e}function Oc(t,e){this.garbageCollector=t,this.asyncQueue=e,this.oe=!1,this.ce=null}function Lc(t){this.ne=t,this.buffer=new Qs(Ac),this.se=0}function Pc(t,e){return _c(t).put((t=t.currentSequenceNumber,new nu(0,ja(e.path),t)))}var Mc,Fc=(Kc.prototype.get=function(t){var e=this.mapKeyFn(t),e=this.inner[e];if(void 0!==e)for(var n=0,r=e;n "+n),1))},Jc.prototype.We=function(){var t=this;null!==this.document&&"function"==typeof this.document.addEventListener&&(this.Fe=function(){t.Se.enqueueAndForget(function(){return t.inForeground="visible"===t.document.visibilityState,t.je()})},this.document.addEventListener("visibilitychange",this.Fe),this.inForeground="visible"===this.document.visibilityState)},Jc.prototype.an=function(){this.Fe&&(this.document.removeEventListener("visibilitychange",this.Fe),this.Fe=null)},Jc.prototype.Ge=function(){var t,e=this;"function"==typeof(null===(t=this.window)||void 0===t?void 0:t.addEventListener)&&(this.ke=function(){e.un(),c()&&navigator.appVersion.match("Version/14")&&e.Se.enterRestrictedMode(!0),e.Se.enqueueAndForget(function(){return e.shutdown()})},this.window.addEventListener("pagehide",this.ke))},Jc.prototype.hn=function(){this.ke&&(this.window.removeEventListener("pagehide",this.ke),this.ke=null)},Jc.prototype.cn=function(t){var e;try{var n=null!==(null===(e=this.Qe)||void 0===e?void 0:e.getItem(this.on(t)));return Kr("IndexedDbPersistence","Client '"+t+"' "+(n?"is":"is not")+" zombied in LocalStorage"),n}catch(t){return Gr("IndexedDbPersistence","Failed to get zombied client id.",t),!1}},Jc.prototype.un=function(){if(this.Qe)try{this.Qe.setItem(this.on(this.clientId),String(Date.now()))}catch(t){Gr("Failed to set zombie client id.",t)}},Jc.prototype.ln=function(){if(this.Qe)try{this.Qe.removeItem(this.on(this.clientId))}catch(t){}},Jc.prototype.on=function(t){return"firestore_zombie_"+this.persistenceKey+"_"+t},Jc);function Jc(t,e,n,r,i,o,s,a,u,c){if(this.allowTabSynchronization=t,this.persistenceKey=e,this.clientId=n,this.Se=i,this.window=o,this.document=s,this.De=u,this.Ce=c,this.Ne=null,this.xe=!1,this.isPrimary=!1,this.networkEnabled=!0,this.ke=null,this.inForeground=!1,this.Fe=null,this.$e=null,this.Oe=Number.NEGATIVE_INFINITY,this.Me=function(t){return Promise.resolve()},!Jc.yt())throw new Ur(Vr.UNIMPLEMENTED,"This platform is either missing IndexedDB or is known to have an incomplete implementation. Offline persistence has been disabled.");this.referenceDelegate=new kc(this,r),this.Le=e+"main",this.R=new Mu(a),this.Be=new pu(this.Le,11,new zc(this.R)),this.qe=new wc(this.referenceDelegate,this.R),this.Ut=new nc,this.Ue=(e=this.R,a=this.Ut,new Vc(e,a)),this.Ke=new Xu,this.window&&this.window.localStorage?this.Qe=this.window.localStorage:(this.Qe=null,!1===c&&Gr("IndexedDbPersistence","LocalStorage is unavailable. As a result, persistence may not work reliably. In particular enablePersistence() could fail immediately after refreshing the page."))}function Zc(t){return xu(t,Qa.store)}function th(t){return xu(t,ou.store)}function eh(t,e){var n=t.projectId;return t.isDefaultDatabase||(n+="."+t.database),"firestore/"+e+"/"+n+"/"}function nh(t,e){this.progress=t,this.wn=e}var rh=(hh.prototype.mn=function(e,n){var r=this;return this._n.getAllMutationBatchesAffectingDocumentKey(e,n).next(function(t){return r.yn(e,n,t)})},hh.prototype.yn=function(t,e,r){return this.Ue.getEntry(t,e).next(function(t){for(var e=0,n=r;ee?this._n[e]:null)},Kh.prototype.getHighestUnacknowledgedBatchId=function(){return fu.resolve(0===this._n.length?-1:this.ss-1)},Kh.prototype.getAllMutationBatches=function(t){return fu.resolve(this._n.slice())},Kh.prototype.getAllMutationBatchesAffectingDocumentKey=function(t,e){var n=this,r=new Dh(e,0),e=new Dh(e,Number.POSITIVE_INFINITY),i=[];return this.rs.forEachInRange([r,e],function(t){t=n.os(t.ns);i.push(t)}),fu.resolve(i)},Kh.prototype.getAllMutationBatchesAffectingDocumentKeys=function(t,e){var n=this,r=new Qs($r);return e.forEach(function(t){var e=new Dh(t,0),t=new Dh(t,Number.POSITIVE_INFINITY);n.rs.forEachInRange([e,t],function(t){r=r.add(t.ns)})}),fu.resolve(this.us(r))},Kh.prototype.getAllMutationBatchesAffectingQuery=function(t,e){var n=e.path,r=n.length+1,e=n;Ni.isDocumentKey(e)||(e=e.child(""));var e=new Dh(new Ni(e),0),i=new Qs($r);return this.rs.forEachWhile(function(t){var e=t.key.path;return!!n.isPrefixOf(e)&&(e.length===r&&(i=i.add(t.ns)),!0)},e),fu.resolve(this.us(i))},Kh.prototype.us=function(t){var e=this,n=[];return t.forEach(function(t){t=e.os(t);null!==t&&n.push(t)}),n},Kh.prototype.removeMutationBatch=function(n,r){var i=this;Wr(0===this.hs(r.batchId,"removed")),this._n.shift();var o=this.rs;return fu.forEach(r.mutations,function(t){var e=new Dh(t.key,r.batchId);return o=o.delete(e),i.referenceDelegate.markPotentiallyOrphaned(n,t.key)}).next(function(){i.rs=o})},Kh.prototype.Gt=function(t){},Kh.prototype.containsKey=function(t,e){var n=new Dh(e,0),n=this.rs.firstAfterOrEqual(n);return fu.resolve(e.isEqual(n&&n.key))},Kh.prototype.performConsistencyCheck=function(t){return this._n.length,fu.resolve()},Kh.prototype.hs=function(t,e){return this.cs(t)},Kh.prototype.cs=function(t){return 0===this._n.length?0:t-this._n[0].batchId},Kh.prototype.os=function(t){t=this.cs(t);return t<0||t>=this._n.length?null:this._n[t]},Kh),Ch=(jh.prototype.addEntry=function(t,e,n){var r=e.key,i=this.docs.get(r),o=i?i.size:0,i=this.ls(e);return this.docs=this.docs.insert(r,{document:e.clone(),size:i,readTime:n}),this.size+=i-o,this.Ut.addToCollectionParentIndex(t,r.path.popLast())},jh.prototype.removeEntry=function(t){var e=this.docs.get(t);e&&(this.docs=this.docs.remove(t),this.size-=e.size)},jh.prototype.getEntry=function(t,e){var n=this.docs.get(e);return fu.resolve(n?n.document.clone():Qi.newInvalidDocument(e))},jh.prototype.getEntries=function(t,e){var n=this,r=zs;return e.forEach(function(t){var e=n.docs.get(t);r=r.insert(t,e?e.document.clone():Qi.newInvalidDocument(t))}),fu.resolve(r)},jh.prototype.getDocumentsMatchingQuery=function(t,e,n){for(var r=zs,i=new Ni(e.path.child("")),o=this.docs.getIteratorFrom(i);o.hasNext();){var s=o.getNext(),a=s.key,u=s.value,s=u.document,u=u.readTime;if(!e.path.isPrefixOf(a.path))break;u.compareTo(n)<=0||Ko(e,s)&&(r=r.insert(s.key,s.clone()))}return fu.resolve(r)},jh.prototype.fs=function(t,e){return fu.forEach(this.docs,function(t){return e(t)})},jh.prototype.newChangeBuffer=function(t){return new kh(this)},jh.prototype.getSize=function(t){return fu.resolve(this.size)},jh),kh=(n(Bh,_h=A),Bh.prototype.applyChanges=function(n){var r=this,i=[];return this.changes.forEach(function(t,e){e.document.isValidDocument()?i.push(r.Ie.addEntry(n,e.document,r.getReadTime(t))):r.Ie.removeEntry(t)}),fu.waitFor(i)},Bh.prototype.getFromCache=function(t,e){return this.Ie.getEntry(t,e)},Bh.prototype.getAllFromCache=function(t,e){return this.Ie.getEntries(t,e)},Bh),Rh=(qh.prototype.forEachTarget=function(t,n){return this.ds.forEach(function(t,e){return n(e)}),fu.resolve()},qh.prototype.getLastRemoteSnapshotVersion=function(t){return fu.resolve(this.lastRemoteSnapshotVersion)},qh.prototype.getHighestSequenceNumber=function(t){return fu.resolve(this.ws)},qh.prototype.allocateTargetId=function(t){return this.highestTargetId=this.ys.next(),fu.resolve(this.highestTargetId)},qh.prototype.setTargetsMetadata=function(t,e,n){return n&&(this.lastRemoteSnapshotVersion=n),e>this.ws&&(this.ws=e),fu.resolve()},qh.prototype.te=function(t){this.ds.set(t.target,t);var e=t.targetId;e>this.highestTargetId&&(this.ys=new vc(e),this.highestTargetId=e),t.sequenceNumber>this.ws&&(this.ws=t.sequenceNumber)},qh.prototype.addTargetData=function(t,e){return this.te(e),this.targetCount+=1,fu.resolve()},qh.prototype.updateTargetData=function(t,e){return this.te(e),fu.resolve()},qh.prototype.removeTargetData=function(t,e){return this.ds.delete(e.target),this._s.Zn(e.targetId),--this.targetCount,fu.resolve()},qh.prototype.removeTargets=function(n,r,i){var o=this,s=0,a=[];return this.ds.forEach(function(t,e){e.sequenceNumber<=r&&null===i.get(e.targetId)&&(o.ds.delete(t),a.push(o.removeMatchingKeysForTargetId(n,e.targetId)),s++)}),fu.waitFor(a).next(function(){return s})},qh.prototype.getTargetCount=function(t){return fu.resolve(this.targetCount)},qh.prototype.getTargetData=function(t,e){e=this.ds.get(e)||null;return fu.resolve(e)},qh.prototype.addMatchingKeys=function(t,e,n){return this._s.Jn(e,n),fu.resolve()},qh.prototype.removeMatchingKeys=function(e,t,n){this._s.Xn(t,n);var r=this.persistence.referenceDelegate,i=[];return r&&t.forEach(function(t){i.push(r.markPotentiallyOrphaned(e,t))}),fu.waitFor(i)},qh.prototype.removeMatchingKeysForTargetId=function(t,e){return this._s.Zn(e),fu.resolve()},qh.prototype.getMatchingKeysForTargetId=function(t,e){e=this._s.es(e);return fu.resolve(e)},qh.prototype.containsKey=function(t,e){return fu.resolve(this._s.containsKey(e))},qh),xh=(Uh.prototype.start=function(){return Promise.resolve()},Uh.prototype.shutdown=function(){return this.xe=!1,Promise.resolve()},Object.defineProperty(Uh.prototype,"started",{get:function(){return this.xe},enumerable:!1,configurable:!0}),Uh.prototype.setDatabaseDeletedListener=function(){},Uh.prototype.setNetworkEnabled=function(){},Uh.prototype.getIndexManager=function(){return this.Ut},Uh.prototype.getMutationQueue=function(t){var e=this.gs[t.toKey()];return e||(e=new Nh(this.Ut,this.referenceDelegate),this.gs[t.toKey()]=e),e},Uh.prototype.getTargetCache=function(){return this.qe},Uh.prototype.getRemoteDocumentCache=function(){return this.Ue},Uh.prototype.getBundleCache=function(){return this.Ke},Uh.prototype.runTransaction=function(t,e,n){var r=this;Kr("MemoryPersistence","Starting transaction:",t);var i=new Oh(this.Ne.next());return this.referenceDelegate.Es(),n(i).next(function(t){return r.referenceDelegate.Ts(i).next(function(){return t})}).toPromise().then(function(t){return i.raiseOnCommittedEvent(),t})},Uh.prototype.Is=function(e,n){return fu.or(Object.values(this.gs).map(function(t){return function(){return t.containsKey(e,n)}}))},Uh),Oh=(n(Vh,Ih=R),Vh),Lh=(Fh.bs=function(t){return new Fh(t)},Object.defineProperty(Fh.prototype,"vs",{get:function(){if(this.Rs)return this.Rs;throw zr()},enumerable:!1,configurable:!0}),Fh.prototype.addReference=function(t,e,n){return this.As.addReference(n,e),this.vs.delete(n.toString()),fu.resolve()},Fh.prototype.removeReference=function(t,e,n){return this.As.removeReference(n,e),this.vs.add(n.toString()),fu.resolve()},Fh.prototype.markPotentiallyOrphaned=function(t,e){return this.vs.add(e.toString()),fu.resolve()},Fh.prototype.removeTarget=function(t,e){var n=this;this.As.Zn(e.targetId).forEach(function(t){return n.vs.add(t.toString())});var r=this.persistence.getTargetCache();return r.getMatchingKeysForTargetId(t,e.targetId).next(function(t){t.forEach(function(t){return n.vs.add(t.toString())})}).next(function(){return r.removeTargetData(t,e)})},Fh.prototype.Es=function(){this.Rs=new Set},Fh.prototype.Ts=function(n){var r=this,i=this.persistence.getRemoteDocumentCache().newChangeBuffer();return fu.forEach(this.vs,function(t){var e=Ni.fromPath(t);return r.Ps(n,e).next(function(t){t||i.removeEntry(e)})}).next(function(){return r.Rs=null,i.apply(n)})},Fh.prototype.updateLimboDocument=function(t,e){var n=this;return this.Ps(t,e).next(function(t){t?n.vs.delete(e.toString()):n.vs.add(e.toString())})},Fh.prototype.ps=function(t){return 0},Fh.prototype.Ps=function(t,e){var n=this;return fu.or([function(){return fu.resolve(n.As.containsKey(e))},function(){return n.persistence.getTargetCache().containsKey(t,e)},function(){return n.persistence.Is(t,e)}])},Fh),Ph=(Mh.prototype.isAuthenticated=function(){return null!=this.uid},Mh.prototype.toKey=function(){return this.isAuthenticated()?"uid:"+this.uid:"anonymous-user"},Mh.prototype.isEqual=function(t){return t.uid===this.uid},Mh);function Mh(t){this.uid=t}function Fh(t){this.persistence=t,this.As=new Ah,this.Rs=null}function Vh(t){var e=this;return(e=Ih.call(this)||this).currentSequenceNumber=t,e}function Uh(t,e){var n=this;this.gs={},this.Ne=new Pr(0),this.xe=!1,this.xe=!0,this.referenceDelegate=t(this),this.qe=new Rh(this),this.Ut=new tc,this.Ue=(t=this.Ut,new Ch(t,function(t){return n.referenceDelegate.ps(t)})),this.R=new Mu(e),this.Ke=new Sh(this.R)}function qh(t){this.persistence=t,this.ds=new Fc(Yi,Xi),this.lastRemoteSnapshotVersion=ei.min(),this.highestTargetId=0,this.ws=0,this._s=new Ah,this.targetCount=0,this.ys=vc.Jt()}function Bh(t){var e=this;return(e=_h.call(this)||this).Ie=t,e}function jh(t,e){this.Ut=t,this.ls=e,this.docs=new Vs(Ni.comparator),this.size=0}function Kh(t,e){this.Ut=t,this.referenceDelegate=e,this._n=[],this.ss=1,this.rs=new Qs(Dh.Gn)}function Gh(t,e){this.key=t,this.ns=e}function Qh(){this.Wn=new Qs(Dh.Gn),this.zn=new Qs(Dh.Hn)}function Hh(t){this.R=t,this.Qn=new Map,this.jn=new Map}function zh(t,e){return"firestore_clients_"+t+"_"+e}function Wh(t,e,n){n="firestore_mutations_"+t+"_"+n;return e.isAuthenticated()&&(n+="_"+e.uid),n}function Yh(t,e){return"firestore_targets_"+t+"_"+e}Ph.UNAUTHENTICATED=new Ph(null),Ph.GOOGLE_CREDENTIALS=new Ph("google-credentials-uid"),Ph.FIRST_PARTY=new Ph("first-party-uid"),Ph.MOCK_USER=new Ph("mock-user");var Xh,$h=(bl.Vs=function(t,e,n){var r,i=JSON.parse(n),o="object"==typeof i&&-1!==["pending","acknowledged","rejected"].indexOf(i.state)&&(void 0===i.error||"object"==typeof i.error);return o&&i.error&&(o="string"==typeof i.error.message&&"string"==typeof i.error.code)&&(r=new Ur(i.error.code,i.error.message)),o?new bl(t,e,i.state,r):(Gr("SharedClientState","Failed to parse mutation state for ID '"+e+"': "+n),null)},bl.prototype.Ss=function(){var t={state:this.state,updateTimeMs:Date.now()};return this.error&&(t.error={code:this.error.code,message:this.error.message}),JSON.stringify(t)},bl),Jh=(wl.Vs=function(t,e){var n,r=JSON.parse(e),i="object"==typeof r&&-1!==["not-current","current","rejected"].indexOf(r.state)&&(void 0===r.error||"object"==typeof r.error);return i&&r.error&&(i="string"==typeof r.error.message&&"string"==typeof r.error.code)&&(n=new Ur(r.error.code,r.error.message)),i?new wl(t,r.state,n):(Gr("SharedClientState","Failed to parse target state for ID '"+t+"': "+e),null)},wl.prototype.Ss=function(){var t={state:this.state,updateTimeMs:Date.now()};return this.error&&(t.error={code:this.error.code,message:this.error.message}),JSON.stringify(t)},wl),Zh=(vl.Vs=function(t,e){for(var n=JSON.parse(e),r="object"==typeof n&&n.activeTargetIds instanceof Array,i=ta,o=0;r&&othis.Bi&&(this.qi=this.Bi)},Vl.prototype.Gi=function(){null!==this.Ui&&(this.Ui.skipDelay(),this.Ui=null)},Vl.prototype.cancel=function(){null!==this.Ui&&(this.Ui.cancel(),this.Ui=null)},Vl.prototype.Wi=function(){return(Math.random()-.5)*this.qi},Vl),A=(Fl.prototype.tr=function(){return 1===this.state||2===this.state||4===this.state},Fl.prototype.er=function(){return 2===this.state},Fl.prototype.start=function(){3!==this.state?this.auth():this.nr()},Fl.prototype.stop=function(){return y(this,void 0,void 0,function(){return g(this,function(t){switch(t.label){case 0:return this.tr()?[4,this.close(0)]:[3,2];case 1:t.sent(),t.label=2;case 2:return[2]}})})},Fl.prototype.sr=function(){this.state=0,this.Zi.reset()},Fl.prototype.ir=function(){var t=this;this.er()&&null===this.Xi&&(this.Xi=this.Se.enqueueAfterDelay(this.zi,6e4,function(){return t.rr()}))},Fl.prototype.cr=function(t){this.ur(),this.stream.send(t)},Fl.prototype.rr=function(){return y(this,void 0,void 0,function(){return g(this,function(t){return this.er()?[2,this.close(0)]:[2]})})},Fl.prototype.ur=function(){this.Xi&&(this.Xi.cancel(),this.Xi=null)},Fl.prototype.close=function(e,n){return y(this,void 0,void 0,function(){return g(this,function(t){switch(t.label){case 0:return this.ur(),this.Zi.cancel(),this.Yi++,3!==e?this.Zi.reset():n&&n.code===Vr.RESOURCE_EXHAUSTED?(Gr(n.toString()),Gr("Using maximum backoff delay to prevent overloading the backend."),this.Zi.Qi()):n&&n.code===Vr.UNAUTHENTICATED&&this.Ji.invalidateToken(),null!==this.stream&&(this.ar(),this.stream.close(),this.stream=null),this.state=e,[4,this.listener.Ri(n)];case 1:return t.sent(),[2]}})})},Fl.prototype.ar=function(){},Fl.prototype.auth=function(){var n=this;this.state=1;var t=this.hr(this.Yi),e=this.Yi;this.Ji.getToken().then(function(t){n.Yi===e&&n.lr(t)},function(e){t(function(){var t=new Ur(Vr.UNKNOWN,"Fetching auth token failed: "+e.message);return n.dr(t)})})},Fl.prototype.lr=function(t){var e=this,n=this.hr(this.Yi);this.stream=this.wr(t),this.stream.Ii(function(){n(function(){return e.state=2,e.listener.Ii()})}),this.stream.Ri(function(t){n(function(){return e.dr(t)})}),this.stream.onMessage(function(t){n(function(){return e.onMessage(t)})})},Fl.prototype.nr=function(){var t=this;this.state=4,this.Zi.ji(function(){return y(t,void 0,void 0,function(){return g(this,function(t){return this.state=0,this.start(),[2]})})})},Fl.prototype.dr=function(t){return Kr("PersistentStream","close with error: "+t),this.stream=null,this.close(3,t)},Fl.prototype.hr=function(e){var n=this;return function(t){n.Se.enqueueAndForget(function(){return n.Yi===e?t():(Kr("PersistentStream","stream callback skipped by getCloseGuardedDispatcher."),Promise.resolve())})}},Fl),Cl=(n(Ml,Dl=A),Ml.prototype.wr=function(t){return this.Hi.Oi("Listen",t)},Ml.prototype.onMessage=function(t){this.Zi.reset();var e=function(t,e){if("targetChange"in e){e.targetChange;var n="NO_CHANGE"===(o=e.targetChange.targetChangeType||"NO_CHANGE")?0:"ADD"===o?1:"REMOVE"===o?2:"CURRENT"===o?3:"RESET"===o?4:zr(),r=e.targetChange.targetIds||[],i=(s=e.targetChange.resumeToken,t.I?(Wr(void 0===s||"string"==typeof s),di.fromBase64String(s||"")):(Wr(void 0===s||s instanceof Uint8Array),di.fromUint8Array(s||new Uint8Array))),o=(a=e.targetChange.cause)&&(u=void 0===(c=a).code?Vr.UNKNOWN:Fs(c.code),new Ur(u,c.message||"")),s=new oa(n,r,i,o||null)}else if("documentChange"in e){e.documentChange,(n=e.documentChange).document,n.document.name,n.document.updateTime;var r=Ia(t,n.document.name),i=wa(n.document.updateTime),a=new Ki({mapValue:{fields:n.document.fields}}),u=(o=Qi.newFoundDocument(r,i,a),n.targetIds||[]),c=n.removedTargetIds||[];s=new ra(u,c,o.key,o)}else if("documentDelete"in e)e.documentDelete,(n=e.documentDelete).document,r=Ia(t,n.document),i=n.readTime?wa(n.readTime):ei.min(),a=Qi.newNoDocument(r,i),o=n.removedTargetIds||[],s=new ra([],o,a.key,a);else if("documentRemove"in e)e.documentRemove,(n=e.documentRemove).document,r=Ia(t,n.document),i=n.removedTargetIds||[],s=new ra([],i,r,null);else{if(!("filter"in e))return zr();e.filter;e=e.filter;e.targetId,n=e.count||0,r=new Ns(n),i=e.targetId,s=new ia(i,r)}return s}(this.R,t),t=function(t){if(!("targetChange"in t))return ei.min();t=t.targetChange;return(!t.targetIds||!t.targetIds.length)&&t.readTime?wa(t.readTime):ei.min()}(t);return this.listener._r(e,t)},Ml.prototype.mr=function(t){var e,n,r,i={};i.database=Aa(this.R),i.addTarget=(e=this.R,(r=$i(r=(n=t).target)?{documents:xa(e,r)}:{query:Oa(e,r)}).targetId=n.targetId,0this.query.limit;){var n=xo(this.query)?h.last():h.first(),h=h.delete(n.key),c=c.delete(n.key);a.track({type:1,doc:n})}return{fo:h,mo:a,Nn:l,mutatedKeys:c}},Pf.prototype.yo=function(t,e){return t.hasLocalMutations&&e.hasCommittedMutations&&!e.hasLocalMutations},Pf.prototype.applyChanges=function(t,e,n){var o=this,r=this.fo;this.fo=t.fo,this.mutatedKeys=t.mutatedKeys;var i=t.mo.jr();i.sort(function(t,e){return r=t.type,i=e.type,n(r)-n(i)||o.lo(t.doc,e.doc);function n(t){switch(t){case 0:return 1;case 2:case 3:return 2;case 1:return 0;default:return zr()}}var r,i}),this.po(n);var s=e?this.Eo():[],n=0===this.ho.size&&this.current?1:0,e=n!==this.ao;return this.ao=n,0!==i.length||e?{snapshot:new lf(this.query,t.fo,r,i,t.mutatedKeys,0==n,e,!1),To:s}:{To:s}},Pf.prototype.zr=function(t){return this.current&&"Offline"===t?(this.current=!1,this.applyChanges({fo:this.fo,mo:new hf,mutatedKeys:this.mutatedKeys,Nn:!1},!1)):{To:[]}},Pf.prototype.Io=function(t){return!this.uo.has(t)&&!!this.fo.has(t)&&!this.fo.get(t).hasLocalMutations},Pf.prototype.po=function(t){var e=this;t&&(t.addedDocuments.forEach(function(t){return e.uo=e.uo.add(t)}),t.modifiedDocuments.forEach(function(t){}),t.removedDocuments.forEach(function(t){return e.uo=e.uo.delete(t)}),this.current=t.current)},Pf.prototype.Eo=function(){var e=this;if(!this.current)return[];var n=this.ho;this.ho=Zs(),this.fo.forEach(function(t){e.Io(t.key)&&(e.ho=e.ho.add(t.key))});var r=[];return n.forEach(function(t){e.ho.has(t)||r.push(new Cf(t))}),this.ho.forEach(function(t){n.has(t)||r.push(new Nf(t))}),r},Pf.prototype.Ao=function(t){this.uo=t.Bn,this.ho=Zs();t=this._o(t.documents);return this.applyChanges(t,!0)},Pf.prototype.Ro=function(){return lf.fromInitialDocuments(this.query,this.fo,this.mutatedKeys,0===this.ao)},Pf),Rf=function(t,e,n){this.query=t,this.targetId=e,this.view=n},xf=function(t){this.key=t,this.bo=!1},Of=(Object.defineProperty(Lf.prototype,"isPrimaryClient",{get:function(){return!0===this.$o},enumerable:!1,configurable:!0}),Lf);function Lf(t,e,n,r,i,o){this.localStore=t,this.remoteStore=e,this.eventManager=n,this.sharedClientState=r,this.currentUser=i,this.maxConcurrentLimboResolutions=o,this.vo={},this.Po=new Fc(Bo,qo),this.Vo=new Map,this.So=new Set,this.Do=new Vs(Ni.comparator),this.Co=new Map,this.No=new Ah,this.xo={},this.ko=new Map,this.Fo=vc.Yt(),this.onlineState="Unknown",this.$o=void 0}function Pf(t,e){this.query=t,this.uo=e,this.ao=null,this.current=!1,this.ho=Zs(),this.mutatedKeys=Zs(),this.lo=Go(t),this.fo=new cf(this.lo)}function Mf(i,o,s,a){return y(this,void 0,void 0,function(){var e,n,r;return g(this,function(t){switch(t.label){case 0:return i.Oo=function(t,e,n){return function(r,i,o,s){return y(this,void 0,void 0,function(){var e,n;return g(this,function(t){switch(t.label){case 0:return(e=i.view._o(o)).Nn?[4,wh(r.localStore,i.query,!1).then(function(t){t=t.documents;return i.view._o(t,e)})]:[3,2];case 1:e=t.sent(),t.label=2;case 2:return n=s&&s.targetChanges.get(i.targetId),n=i.view.applyChanges(e,r.isPrimaryClient,n),[2,(Hf(r,i.targetId,n.To),n.snapshot)]}})})}(i,t,e,n)},[4,wh(i.localStore,o,!0)];case 1:return n=t.sent(),r=new kf(o,n.Bn),e=r._o(n.documents),n=na.createSynthesizedTargetChangeForCurrentChange(s,a&&"Offline"!==i.onlineState),n=r.applyChanges(e,i.isPrimaryClient,n),Hf(i,s,n.To),r=new Rf(o,s,r),[2,(i.Po.set(o,r),i.Vo.has(s)?i.Vo.get(s).push(o):i.Vo.set(s,[o]),n.snapshot)]}})})}function Ff(f,d,p){return y(this,void 0,void 0,function(){var s,l;return g(this,function(t){switch(t.label){case 0:l=ed(f),t.label=1;case 1:return t.trys.push([1,5,,6]),[4,(i=l.localStore,a=d,c=i,h=ti.now(),o=a.reduce(function(t,e){return t.add(e.key)},Zs()),c.persistence.runTransaction("Locally write mutations","readwrite",function(s){return c.Mn.pn(s,o).next(function(t){u=t;for(var e=[],n=0,r=a;n, or >=) must be on the same field. But you have inequality filters on '"+n.toString()+"' and '"+e.field.toString()+"'");n=Lo(t);null!==n&&ag(0,e.field,n)}t=function(t,e){for(var n=0,r=t.filters;ns.length)throw new Ur(Vr.INVALID_ARGUMENT,"Too many arguments provided to "+r+"(). The number of arguments must be less than or equal to the number of orderBy() clauses");for(var a=[],u=0;u, or >=) on field '"+e.toString()+"' and so you must also use '"+e.toString()+"' as your first argument to orderBy(), but your first orderBy() is on field '"+n.toString()+"' instead.")}ug.prototype.convertValue=function(t,e){switch(void 0===e&&(e="none"),ki(t)){case 0:return null;case 1:return t.booleanValue;case 2:return Ei(t.integerValue||t.doubleValue);case 3:return this.convertTimestamp(t.timestampValue);case 4:return this.convertServerTimestamp(t,e);case 5:return t.stringValue;case 6:return this.convertBytes(Ti(t.bytesValue));case 7:return this.convertReference(t.referenceValue);case 8:return this.convertGeoPoint(t.geoPointValue);case 9:return this.convertArray(t.arrayValue,e);case 10:return this.convertObject(t.mapValue,e);default:throw zr()}},ug.prototype.convertObject=function(t,n){var r=this,i={};return oi(t.fields,function(t,e){i[t]=r.convertValue(e,n)}),i},ug.prototype.convertGeoPoint=function(t){return new Lp(Ei(t.latitude),Ei(t.longitude))},ug.prototype.convertArray=function(t,e){var n=this;return(t.values||[]).map(function(t){return n.convertValue(t,e)})},ug.prototype.convertServerTimestamp=function(t,e){switch(e){case"previous":var n=function t(e){e=e.mapValue.fields.__previous_value__;return Ii(e)?t(e):e}(t);return null==n?null:this.convertValue(n,e);case"estimate":return this.convertTimestamp(_i(t));default:return null}},ug.prototype.convertTimestamp=function(t){t=bi(t);return new ti(t.seconds,t.nanos)},ug.prototype.convertDocumentKey=function(t,e){var n=ci.fromString(t);Wr(Ba(n));t=new Fd(n.get(1),n.get(3)),n=new Ni(n.popFirst(5));return t.isEqual(e)||Gr("Document "+n+" contains a document reference within a different database ("+t.projectId+"/"+t.database+") which is not supported. It will be treated as a reference in the current database ("+e.projectId+"/"+e.database+") instead."),n},A=ug;function ug(){}function cg(t,e,n){return t?n&&(n.merge||n.mergeFields)?t.toFirestore(e,n):t.toFirestore(e):e}var hg,lg=(n(pg,hg=A),pg.prototype.convertBytes=function(t){return new xp(t)},pg.prototype.convertReference=function(t){t=this.convertDocumentKey(t,this.firestore._databaseId);return new ap(this.firestore,null,t)},pg),fg=(dg.prototype.set=function(t,e,n){this._verifyNotCommitted();t=yg(t,this._firestore),e=cg(t.converter,e,n),n=Yp(this._dataReader,"WriteBatch.set",t._key,e,null!==t.converter,n);return this._mutations.push(n.toMutation(t._key,ds.none())),this},dg.prototype.update=function(t,e,n){for(var r=[],i=3;i Date: Tue, 3 May 2022 14:02:58 -0500 Subject: [PATCH 08/10] Revert "first config changes for release" This reverts commit 40104d037dd0bd92d4a23a7962c640f4c6dd8445. --- .firebaserc | 5 ----- firebase.json | 8 ++++++-- web/__/firebase/8.10.1/firebase-app.js | 2 ++ web/__/firebase/8.10.1/firebase-auth.js | 2 ++ web/__/firebase/8.10.1/firebase-firestore.js | 2 ++ web/__/firebase/init.js | 11 +++++++++++ 6 files changed, 23 insertions(+), 7 deletions(-) delete mode 100644 .firebaserc create mode 100644 web/__/firebase/8.10.1/firebase-app.js create mode 100644 web/__/firebase/8.10.1/firebase-auth.js create mode 100644 web/__/firebase/8.10.1/firebase-firestore.js create mode 100644 web/__/firebase/init.js diff --git a/.firebaserc b/.firebaserc deleted file mode 100644 index 98857542..00000000 --- a/.firebaserc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "projects": { - "default": "io-pinball" - } -} diff --git a/firebase.json b/firebase.json index 99025785..80e2ae69 100644 --- a/firebase.json +++ b/firebase.json @@ -1,7 +1,11 @@ { "hosting": { "public": "build/web", - "site": "io-pinball", - "ignore": ["firebase.json", "**/.*", "**/node_modules/**"] + "site": "ashehwkdkdjruejdnensjsjdne", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ] } } diff --git a/web/__/firebase/8.10.1/firebase-app.js b/web/__/firebase/8.10.1/firebase-app.js new file mode 100644 index 00000000..c688d1c4 --- /dev/null +++ b/web/__/firebase/8.10.1/firebase-app.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).firebase=t()}(this,function(){"use strict";var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};var n=function(){return(n=Object.assign||function(e){for(var t,n=1,r=arguments.length;na[0]&&t[1]=e.length?void 0:e)&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function f(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),a=[];try{for(;(void 0===t||0"})):"Error",e=this.serviceName+": "+e+" ("+o+").";return new c(o,e,i)},v);function v(e,t,n){this.service=e,this.serviceName=t,this.errors=n}var m=/\{\$([^}]+)}/g;function y(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function g(e,t){t=new b(e,t);return t.subscribe.bind(t)}var b=(I.prototype.next=function(t){this.forEachObserver(function(e){e.next(t)})},I.prototype.error=function(t){this.forEachObserver(function(e){e.error(t)}),this.close(t)},I.prototype.complete=function(){this.forEachObserver(function(e){e.complete()}),this.close()},I.prototype.subscribe=function(e,t,n){var r,i=this;if(void 0===e&&void 0===t&&void 0===n)throw new Error("Missing Observer.");void 0===(r=function(e,t){if("object"!=typeof e||null===e)return!1;for(var n=0,r=t;n=(null!=o?o:e.logLevel)&&a({level:R[t].toLowerCase(),message:i,args:n,type:e.name})}}(n[e])}var H=((H={})["no-app"]="No Firebase App '{$appName}' has been created - call Firebase App.initializeApp()",H["bad-app-name"]="Illegal App name: '{$appName}",H["duplicate-app"]="Firebase App named '{$appName}' already exists",H["app-deleted"]="Firebase App named '{$appName}' already deleted",H["invalid-app-argument"]="firebase.{$appName}() takes either no argument or a Firebase App instance.",H["invalid-log-argument"]="First argument to `onLog` must be null or a function.",H),V=new d("app","Firebase",H),B="@firebase/app",M="[DEFAULT]",U=((H={})[B]="fire-core",H["@firebase/analytics"]="fire-analytics",H["@firebase/app-check"]="fire-app-check",H["@firebase/auth"]="fire-auth",H["@firebase/database"]="fire-rtdb",H["@firebase/functions"]="fire-fn",H["@firebase/installations"]="fire-iid",H["@firebase/messaging"]="fire-fcm",H["@firebase/performance"]="fire-perf",H["@firebase/remote-config"]="fire-rc",H["@firebase/storage"]="fire-gcs",H["@firebase/firestore"]="fire-fst",H["fire-js"]="fire-js",H["firebase-wrapper"]="fire-js-all",H),W=new z("@firebase/app"),G=(Object.defineProperty($.prototype,"automaticDataCollectionEnabled",{get:function(){return this.checkDestroyed_(),this.automaticDataCollectionEnabled_},set:function(e){this.checkDestroyed_(),this.automaticDataCollectionEnabled_=e},enumerable:!1,configurable:!0}),Object.defineProperty($.prototype,"name",{get:function(){return this.checkDestroyed_(),this.name_},enumerable:!1,configurable:!0}),Object.defineProperty($.prototype,"options",{get:function(){return this.checkDestroyed_(),this.options_},enumerable:!1,configurable:!0}),$.prototype.delete=function(){var t=this;return new Promise(function(e){t.checkDestroyed_(),e()}).then(function(){return t.firebase_.INTERNAL.removeApp(t.name_),Promise.all(t.container.getProviders().map(function(e){return e.delete()}))}).then(function(){t.isDeleted_=!0})},$.prototype._getService=function(e,t){void 0===t&&(t=M),this.checkDestroyed_();var n=this.container.getProvider(e);return n.isInitialized()||"EXPLICIT"!==(null===(e=n.getComponent())||void 0===e?void 0:e.instantiationMode)||n.initialize(),n.getImmediate({identifier:t})},$.prototype._removeServiceInstance=function(e,t){void 0===t&&(t=M),this.container.getProvider(e).clearInstance(t)},$.prototype._addComponent=function(t){try{this.container.addComponent(t)}catch(e){W.debug("Component "+t.name+" failed to register with FirebaseApp "+this.name,e)}},$.prototype._addOrOverwriteComponent=function(e){this.container.addOrOverwriteComponent(e)},$.prototype.toJSON=function(){return{name:this.name,automaticDataCollectionEnabled:this.automaticDataCollectionEnabled,options:this.options}},$.prototype.checkDestroyed_=function(){if(this.isDeleted_)throw V.create("app-deleted",{appName:this.name_})},$);function $(e,t,n){var r=this;this.firebase_=n,this.isDeleted_=!1,this.name_=t.name,this.automaticDataCollectionEnabled_=t.automaticDataCollectionEnabled||!1,this.options_=h(void 0,e),this.container=new S(t.name),this._addComponent(new O("app",function(){return r},"PUBLIC")),this.firebase_.INTERNAL.components.forEach(function(e){return r._addComponent(e)})}G.prototype.name&&G.prototype.options||G.prototype.delete||console.log("dc");var K="8.10.1";function Y(a){var s={},l=new Map,c={__esModule:!0,initializeApp:function(e,t){void 0===t&&(t={});"object"==typeof t&&null!==t||(t={name:t});var n=t;void 0===n.name&&(n.name=M);t=n.name;if("string"!=typeof t||!t)throw V.create("bad-app-name",{appName:String(t)});if(y(s,t))throw V.create("duplicate-app",{appName:t});n=new a(e,n,c);return s[t]=n},app:u,registerVersion:function(e,t,n){var r=null!==(i=U[e])&&void 0!==i?i:e;n&&(r+="-"+n);var i=r.match(/\s|\//),e=t.match(/\s|\//);i||e?(n=['Unable to register library "'+r+'" with version "'+t+'":'],i&&n.push('library name "'+r+'" contains illegal characters (whitespace or "/")'),i&&e&&n.push("and"),e&&n.push('version name "'+t+'" contains illegal characters (whitespace or "/")'),W.warn(n.join(" "))):o(new O(r+"-version",function(){return{library:r,version:t}},"VERSION"))},setLogLevel:T,onLog:function(e,t){if(null!==e&&"function"!=typeof e)throw V.create("invalid-log-argument");x(e,t)},apps:null,SDK_VERSION:K,INTERNAL:{registerComponent:o,removeApp:function(e){delete s[e]},components:l,useAsService:function(e,t){return"serverAuth"!==t?t:null}}};function u(e){if(!y(s,e=e||M))throw V.create("no-app",{appName:e});return s[e]}function o(n){var e,r=n.name;if(l.has(r))return W.debug("There were multiple attempts to register component "+r+"."),"PUBLIC"===n.type?c[r]:null;l.set(r,n),"PUBLIC"===n.type&&(e=function(e){if("function"!=typeof(e=void 0===e?u():e)[r])throw V.create("invalid-app-argument",{appName:r});return e[r]()},void 0!==n.serviceProps&&h(e,n.serviceProps),c[r]=e,a.prototype[r]=function(){for(var e=[],t=0;t>>0),i=0;function r(t,e,n){return t.call.apply(t.bind,arguments)}function g(e,n,t){if(!e)throw Error();if(2/g,Q=/"/g,tt=/'/g,et=/\x00/g,nt=/[\x00&<>"']/;function it(t,e){return-1!=t.indexOf(e)}function rt(t,e){return t"}else o=void 0===t?"undefined":null===t?"null":typeof t;D("Argument is not a %s (or a non-Element, non-Location mock); got: %s",e,o)}}function dt(t,e){this.a=t===gt&&e||"",this.b=mt}function pt(t){return t instanceof dt&&t.constructor===dt&&t.b===mt?t.a:(D("expected object of type Const, got '"+t+"'"),"type_error:Const")}dt.prototype.ta=!0,dt.prototype.sa=function(){return this.a},dt.prototype.toString=function(){return"Const{"+this.a+"}"};var vt,mt={},gt={};function bt(){if(void 0===vt){var t=null,e=l.trustedTypes;if(e&&e.createPolicy){try{t=e.createPolicy("goog#html",{createHTML:I,createScript:I,createScriptURL:I})}catch(t){l.console&&l.console.error(t.message)}vt=t}else vt=t}return vt}function yt(t,e){this.a=e===At?t:""}function wt(t){return t instanceof yt&&t.constructor===yt?t.a:(D("expected object of type TrustedResourceUrl, got '"+t+"' of type "+d(t)),"type_error:TrustedResourceUrl")}function It(t,n){var e,i=pt(t);if(!Et.test(i))throw Error("Invalid TrustedResourceUrl format: "+i);return t=i.replace(Tt,function(t,e){if(!Object.prototype.hasOwnProperty.call(n,e))throw Error('Found marker, "'+e+'", in format string, "'+i+'", but no valid label mapping found in args: '+JSON.stringify(n));return(t=n[e])instanceof dt?pt(t):encodeURIComponent(String(t))}),e=t,t=bt(),new yt(e=t?t.createScriptURL(e):e,At)}yt.prototype.ta=!0,yt.prototype.sa=function(){return this.a.toString()},yt.prototype.toString=function(){return"TrustedResourceUrl{"+this.a+"}"};var Tt=/%{(\w+)}/g,Et=/^((https:)?\/\/[0-9a-z.:[\]-]+\/|\/[^/\\]|[^:/\\%]+\/|[^:/\\%]*[?#]|about:blank#)/i,At={};function kt(t,e){this.a=e===Dt?t:""}function St(t){return t instanceof kt&&t.constructor===kt?t.a:(D("expected object of type SafeUrl, got '"+t+"' of type "+d(t)),"type_error:SafeUrl")}kt.prototype.ta=!0,kt.prototype.sa=function(){return this.a.toString()},kt.prototype.toString=function(){return"SafeUrl{"+this.a+"}"};var Nt=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|text\/csv|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,_t=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Ot=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ct(t){return t instanceof kt?t:(t="object"==typeof t&&t.ta?t.sa():String(t),t=Ot.test(t)||(e=(t=(t=String(t)).replace(/(%0A|%0D)/g,"")).match(_t))&&Nt.test(e[1])?new kt(t,Dt):null);var e}function Rt(t){return t instanceof kt?t:(t="object"==typeof t&&t.ta?t.sa():String(t),new kt(t=!Ot.test(t)?"about:invalid#zClosurez":t,Dt))}var Dt={},Pt=new kt("about:invalid#zClosurez",Dt);function Lt(t,e,n){this.a=n===xt?t:""}Lt.prototype.ta=!0,Lt.prototype.sa=function(){return this.a.toString()},Lt.prototype.toString=function(){return"SafeHtml{"+this.a+"}"};var xt={};function Mt(t,e,n,i){return t=t instanceof kt?t:Rt(t),e=e||l,n=n instanceof dt?pt(n):n||"",e.open(St(t),n,i,void 0)}function jt(t){for(var e=t.split("%s"),n="",i=Array.prototype.slice.call(arguments,1);i.length&&1")?t.replace(Z,">"):t).indexOf('"')?t.replace(Q,"""):t).indexOf("'")?t.replace(tt,"'"):t).indexOf("\0")&&(t=t.replace(et,"�"))),t}function Vt(t){return Vt[" "](t),t}Vt[" "]=a;var Ft,qt=at("Opera"),Ht=at("Trident")||at("MSIE"),Kt=at("Edge"),Gt=Kt||Ht,Bt=at("Gecko")&&!(it(J.toLowerCase(),"webkit")&&!at("Edge"))&&!(at("Trident")||at("MSIE"))&&!at("Edge"),Wt=it(J.toLowerCase(),"webkit")&&!at("Edge");function Xt(){var t=l.document;return t?t.documentMode:void 0}t:{var Jt="",Yt=(Yt=J,Bt?/rv:([^\);]+)(\)|;)/.exec(Yt):Kt?/Edge\/([\d\.]+)/.exec(Yt):Ht?/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(Yt):Wt?/WebKit\/(\S+)/.exec(Yt):qt?/(?:Version)[ \/]?(\S+)/.exec(Yt):void 0);if(Yt&&(Jt=Yt?Yt[1]:""),Ht){Yt=Xt();if(null!=Yt&&Yt>parseFloat(Jt)){Ft=String(Yt);break t}}Ft=Jt}var zt={};function $t(s){return t=s,e=function(){for(var t=0,e=Y(String(Ft)).split("."),n=Y(String(s)).split("."),i=Math.max(e.length,n.length),r=0;0==t&&r"),i=i.join("")),i=ae(n,i),r&&("string"==typeof r?i.className=r:Array.isArray(r)?i.className=r.join(" "):ee(i,r)),2>>0);function ln(e){return v(e)?e:(e[hn]||(e[hn]=function(t){return e.handleEvent(t)}),e[hn])}function fn(){Pe.call(this),this.v=new Je(this),(this.bc=this).hb=null}function dn(t,e,n,i,r){t.v.add(String(e),n,!1,i,r)}function pn(t,e,n,i,r){t.v.add(String(e),n,!0,i,r)}function vn(t,e,n,i){if(!(e=t.v.a[String(e)]))return!0;e=e.concat();for(var r=!0,o=0;o>4&15).toString(16)+(15&t).toString(16)}An.prototype.toString=function(){var t=[],e=this.c;e&&t.push(Pn(e,xn,!0),":");var n=this.a;return!n&&"file"!=e||(t.push("//"),(e=this.l)&&t.push(Pn(e,xn,!0),"@"),t.push(encodeURIComponent(String(n)).replace(/%25([0-9a-fA-F]{2})/g,"%$1")),null!=(n=this.g)&&t.push(":",String(n))),(n=this.f)&&(this.a&&"/"!=n.charAt(0)&&t.push("/"),t.push(Pn(n,"/"==n.charAt(0)?jn:Mn,!0))),(n=this.b.toString())&&t.push("?",n),(n=this.h)&&t.push("#",Pn(n,Vn)),t.join("")},An.prototype.resolve=function(t){var e=new An(this),n=!!t.c;n?kn(e,t.c):n=!!t.l,n?e.l=t.l:n=!!t.a,n?e.a=t.a:n=null!=t.g;var i=t.f;if(n)Sn(e,t.g);else if(n=!!t.f)if("/"!=i.charAt(0)&&(this.a&&!this.f?i="/"+i:-1!=(r=e.f.lastIndexOf("/"))&&(i=e.f.substr(0,r+1)+i)),".."==(r=i)||"."==r)i="";else if(it(r,"./")||it(r,"/.")){for(var i=0==r.lastIndexOf("/",0),r=r.split("/"),o=[],a=0;a2*t.c&&In(t)))}function Gn(t,e){return qn(t),e=Xn(t,e),Tn(t.a.b,e)}function Bn(t,e,n){Kn(t,e),0',t=new Lt(t=(i=bt())?i.createHTML(t):t,0,xt),i=a.document)&&(i.write((o=t)instanceof Lt&&o.constructor===Lt?o.a:(D("expected object of type SafeHtml, got '"+o+"' of type "+d(o)),"type_error:SafeHtml")),i.close())):(a=Mt(e,i,n,a))&&t.noopener&&(a.opener=null),a)try{a.focus()}catch(t){}return a}var oi=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/,ai=/^[^@]+@[^@]+$/;function si(){var e=null;return new fe(function(t){"complete"==l.document.readyState?t():(e=function(){t()},en(window,"load",e))}).o(function(t){throw nn(window,"load",e),t})}function ui(t){return t=t||bi(),!("file:"!==Ei()&&"ionic:"!==Ei()||!t.toLowerCase().match(/iphone|ipad|ipod|android/))}function ci(){var t=l.window;try{return t&&t!=t.top}catch(t){return}}function hi(){return void 0!==l.WorkerGlobalScope&&"function"==typeof l.importScripts}function li(){return Zl.default.INTERNAL.hasOwnProperty("reactNative")?"ReactNative":Zl.default.INTERNAL.hasOwnProperty("node")?"Node":hi()?"Worker":"Browser"}function fi(){var t=li();return"ReactNative"===t||"Node"===t}var di="Firefox",pi="Chrome";function vi(t){var e=t.toLowerCase();return it(e,"opera/")||it(e,"opr/")||it(e,"opios/")?"Opera":it(e,"iemobile")?"IEMobile":it(e,"msie")||it(e,"trident/")?"IE":it(e,"edge/")?"Edge":it(e,"firefox/")?di:it(e,"silk/")?"Silk":it(e,"blackberry")?"Blackberry":it(e,"webos")?"Webos":!it(e,"safari/")||it(e,"chrome/")||it(e,"crios/")||it(e,"android")?!it(e,"chrome/")&&!it(e,"crios/")||it(e,"edge/")?it(e,"android")?"Android":(t=t.match(/([a-zA-Z\d\.]+)\/[a-zA-Z\d\.]*$/))&&2==t.length?t[1]:"Other":pi:"Safari"}var mi={md:"FirebaseCore-web",od:"FirebaseUI-web"};function gi(t,e){e=e||[];var n,i=[],r={};for(n in mi)r[mi[n]]=!0;for(n=0;n>4),64!=a&&(t(o<<4&240|a>>2),64!=s&&t(a<<6&192|s))}}(t,function(t){e.push(t)}),e}function Pr(t){var e=xr(t);if(!(e&&e.sub&&e.iss&&e.aud&&e.exp))throw Error("Invalid JWT");this.h=t,this.a=e.exp,this.i=e.sub,t=Date.now()/1e3,this.g=e.iat||(t>this.a?this.a:t),this.b=e.provider_id||e.firebase&&e.firebase.sign_in_provider||null,this.f=e.firebase&&e.firebase.tenant||null,this.c=!!e.is_anonymous||"anonymous"==this.b}function Lr(t){try{return new Pr(t)}catch(t){return null}}function xr(t){if(!t)return null;if(3!=(t=t.split(".")).length)return null;for(var e=(4-(t=t[1]).length%4)%4,n=0;n>10)),t[n++]=String.fromCharCode(56320+(1023&a))):(r=i[e++],o=i[e++],t[n++]=String.fromCharCode((15&s)<<12|(63&r)<<6|63&o))}return JSON.parse(t.join(""))}catch(t){}return null}Pr.prototype.T=function(){return this.f},Pr.prototype.l=function(){return this.c},Pr.prototype.toString=function(){return this.h};var Mr="oauth_consumer_key oauth_nonce oauth_signature oauth_signature_method oauth_timestamp oauth_token oauth_version".split(" "),jr=["client_id","response_type","scope","redirect_uri","state"],Ur={nd:{Ja:"locale",va:700,ua:600,fa:"facebook.com",Ya:jr},pd:{Ja:null,va:500,ua:750,fa:"github.com",Ya:jr},qd:{Ja:"hl",va:515,ua:680,fa:"google.com",Ya:jr},wd:{Ja:"lang",va:485,ua:705,fa:"twitter.com",Ya:Mr},kd:{Ja:"locale",va:640,ua:600,fa:"apple.com",Ya:[]}};function Vr(t){for(var e in Ur)if(Ur[e].fa==t)return Ur[e];return null}function Fr(t){var e={};e["facebook.com"]=Br,e["google.com"]=Xr,e["github.com"]=Wr,e["twitter.com"]=Jr;var n=t&&t[Hr];try{if(n)return new(e[n]||Gr)(t);if(void 0!==t[qr])return new Kr(t)}catch(t){}return null}var qr="idToken",Hr="providerId";function Kr(t){var e,n=t[Hr];if(n||!t[qr]||(e=Lr(t[qr]))&&e.b&&(n=e.b),!n)throw Error("Invalid additional user info!");e=!1,void 0!==t.isNewUser?e=!!t.isNewUser:"identitytoolkit#SignupNewUserResponse"===t.kind&&(e=!0),Fi(this,"providerId",n="anonymous"==n||"custom"==n?null:n),Fi(this,"isNewUser",e)}function Gr(t){Kr.call(this,t),Fi(this,"profile",Ki((t=Ni(t.rawUserInfo||"{}"))||{}))}function Br(t){if(Gr.call(this,t),"facebook.com"!=this.providerId)throw Error("Invalid provider ID!")}function Wr(t){if(Gr.call(this,t),"github.com"!=this.providerId)throw Error("Invalid provider ID!");Fi(this,"username",this.profile&&this.profile.login||null)}function Xr(t){if(Gr.call(this,t),"google.com"!=this.providerId)throw Error("Invalid provider ID!")}function Jr(t){if(Gr.call(this,t),"twitter.com"!=this.providerId)throw Error("Invalid provider ID!");Fi(this,"username",t.screenName||null)}function Yr(t){var e=On(i=Cn(t),"link"),n=On(Cn(e),"link"),i=On(i,"deep_link_id");return On(Cn(i),"link")||i||n||e||t}function zr(t,e){if(!t&&!e)throw new T("internal-error","Internal assert: no raw session string available");if(t&&e)throw new T("internal-error","Internal assert: unable to determine the session type");this.a=t||null,this.b=e||null,this.type=this.a?$r:Zr}w(Gr,Kr),w(Br,Gr),w(Wr,Gr),w(Xr,Gr),w(Jr,Gr);var $r="enroll",Zr="signin";function Qr(){}function to(t,n){return t.then(function(t){if(t[Ka]){var e=Lr(t[Ka]);if(!e||n!=e.i)throw new T("user-mismatch");return t}throw new T("user-mismatch")}).o(function(t){throw t&&t.code&&t.code==k+"user-not-found"?new T("user-mismatch"):t})}function eo(t,e){if(!e)throw new T("internal-error","failed to construct a credential");this.a=e,Fi(this,"providerId",t),Fi(this,"signInMethod",t)}function no(t){return{pendingToken:t.a,requestUri:"http://localhost"}}function io(t){if(t&&t.providerId&&t.signInMethod&&0==t.providerId.indexOf("saml.")&&t.pendingToken)try{return new eo(t.providerId,t.pendingToken)}catch(t){}return null}function ro(t,e,n){if(this.a=null,e.idToken||e.accessToken)e.idToken&&Fi(this,"idToken",e.idToken),e.accessToken&&Fi(this,"accessToken",e.accessToken),e.nonce&&!e.pendingToken&&Fi(this,"nonce",e.nonce),e.pendingToken&&(this.a=e.pendingToken);else{if(!e.oauthToken||!e.oauthTokenSecret)throw new T("internal-error","failed to construct a credential");Fi(this,"accessToken",e.oauthToken),Fi(this,"secret",e.oauthTokenSecret)}Fi(this,"providerId",t),Fi(this,"signInMethod",n)}function oo(t){var e={};return t.idToken&&(e.id_token=t.idToken),t.accessToken&&(e.access_token=t.accessToken),t.secret&&(e.oauth_token_secret=t.secret),e.providerId=t.providerId,t.nonce&&!t.a&&(e.nonce=t.nonce),e={postBody:Hn(e).toString(),requestUri:"http://localhost"},t.a&&(delete e.postBody,e.pendingToken=t.a),e}function ao(t){if(t&&t.providerId&&t.signInMethod){var e={idToken:t.oauthIdToken,accessToken:t.oauthTokenSecret?null:t.oauthAccessToken,oauthTokenSecret:t.oauthTokenSecret,oauthToken:t.oauthTokenSecret&&t.oauthAccessToken,nonce:t.nonce,pendingToken:t.pendingToken};try{return new ro(t.providerId,e,t.signInMethod)}catch(t){}}return null}function so(t,e){this.Qc=e||[],qi(this,{providerId:t,isOAuthProvider:!0}),this.Jb={},this.qb=(Vr(t)||{}).Ja||null,this.pb=null}function uo(t){if("string"!=typeof t||0!=t.indexOf("saml."))throw new T("argument-error",'SAML provider IDs must be prefixed with "saml."');so.call(this,t,[])}function co(t){so.call(this,t,jr),this.a=[]}function ho(){co.call(this,"facebook.com")}function lo(t){if(!t)throw new T("argument-error","credential failed: expected 1 argument (the OAuth access token).");var e=t;return m(t)&&(e=t.accessToken),(new ho).credential({accessToken:e})}function fo(){co.call(this,"github.com")}function po(t){if(!t)throw new T("argument-error","credential failed: expected 1 argument (the OAuth access token).");var e=t;return m(t)&&(e=t.accessToken),(new fo).credential({accessToken:e})}function vo(){co.call(this,"google.com"),this.Ca("profile")}function mo(t,e){var n=t;return m(t)&&(n=t.idToken,e=t.accessToken),(new vo).credential({idToken:n,accessToken:e})}function go(){so.call(this,"twitter.com",Mr)}function bo(t,e){var n=t;if(!(n=!m(n)?{oauthToken:t,oauthTokenSecret:e}:n).oauthToken||!n.oauthTokenSecret)throw new T("argument-error","credential failed: expected 2 arguments (the OAuth access token and secret).");return new ro("twitter.com",n,"twitter.com")}function yo(t,e,n){this.a=t,this.f=e,Fi(this,"providerId","password"),Fi(this,"signInMethod",n===Io.EMAIL_LINK_SIGN_IN_METHOD?Io.EMAIL_LINK_SIGN_IN_METHOD:Io.EMAIL_PASSWORD_SIGN_IN_METHOD)}function wo(t){return t&&t.email&&t.password?new yo(t.email,t.password,t.signInMethod):null}function Io(){qi(this,{providerId:"password",isOAuthProvider:!1})}function To(t,e){if(!(e=Eo(e)))throw new T("argument-error","Invalid email link!");return new yo(t,e.code,Io.EMAIL_LINK_SIGN_IN_METHOD)}function Eo(t){return(t=yr(t=Yr(t)))&&t.operation===Qi?t:null}function Ao(t){if(!(t.fb&&t.eb||t.La&&t.ea))throw new T("internal-error");this.a=t,Fi(this,"providerId","phone"),this.fa="phone",Fi(this,"signInMethod","phone")}function ko(e){if(e&&"phone"===e.providerId&&(e.verificationId&&e.verificationCode||e.temporaryProof&&e.phoneNumber)){var n={};return V(["verificationId","verificationCode","temporaryProof","phoneNumber"],function(t){e[t]&&(n[t]=e[t])}),new Ao(n)}return null}function So(t){return t.a.La&&t.a.ea?{temporaryProof:t.a.La,phoneNumber:t.a.ea}:{sessionInfo:t.a.fb,code:t.a.eb}}function No(t){try{this.a=t||Zl.default.auth()}catch(t){throw new T("argument-error","Either an instance of firebase.auth.Auth must be passed as an argument to the firebase.auth.PhoneAuthProvider constructor, or the default firebase App instance must be initialized via firebase.initializeApp().")}qi(this,{providerId:"phone",isOAuthProvider:!1})}function _o(t,e){if(!t)throw new T("missing-verification-id");if(!e)throw new T("missing-verification-code");return new Ao({fb:t,eb:e})}function Oo(t){if(t.temporaryProof&&t.phoneNumber)return new Ao({La:t.temporaryProof,ea:t.phoneNumber});var e=t&&t.providerId;if(!e||"password"===e)return null;var n=t&&t.oauthAccessToken,i=t&&t.oauthTokenSecret,r=t&&t.nonce,o=t&&t.oauthIdToken,a=t&&t.pendingToken;try{switch(e){case"google.com":return mo(o,n);case"facebook.com":return lo(n);case"github.com":return po(n);case"twitter.com":return bo(n,i);default:return n||i||o||a?a?0==e.indexOf("saml.")?new eo(e,a):new ro(e,{pendingToken:a,idToken:t.oauthIdToken,accessToken:t.oauthAccessToken},e):new co(e).credential({idToken:o,accessToken:n,rawNonce:r}):null}}catch(t){return null}}function Co(t){if(!t.isOAuthProvider)throw new T("invalid-oauth-provider")}function Ro(t,e,n,i,r,o,a){if(this.c=t,this.b=e||null,this.g=n||null,this.f=i||null,this.i=o||null,this.h=a||null,this.a=r||null,!this.g&&!this.a)throw new T("invalid-auth-event");if(this.g&&this.a)throw new T("invalid-auth-event");if(this.g&&!this.f)throw new T("invalid-auth-event")}function Do(t){return(t=t||{}).type?new Ro(t.type,t.eventId,t.urlResponse,t.sessionId,t.error&&E(t.error),t.postBody,t.tenantId):null}function Po(){this.b=null,this.a=[]}zr.prototype.Ha=function(){return this.a?ye(this.a):ye(this.b)},zr.prototype.w=function(){return this.type==$r?{multiFactorSession:{idToken:this.a}}:{multiFactorSession:{pendingCredential:this.b}}},Qr.prototype.ka=function(){},Qr.prototype.b=function(){},Qr.prototype.c=function(){},Qr.prototype.w=function(){},eo.prototype.ka=function(t){return ls(t,no(this))},eo.prototype.b=function(t,e){var n=no(this);return n.idToken=e,fs(t,n)},eo.prototype.c=function(t,e){return to(ds(t,no(this)),e)},eo.prototype.w=function(){return{providerId:this.providerId,signInMethod:this.signInMethod,pendingToken:this.a}},ro.prototype.ka=function(t){return ls(t,oo(this))},ro.prototype.b=function(t,e){var n=oo(this);return n.idToken=e,fs(t,n)},ro.prototype.c=function(t,e){return to(ds(t,oo(this)),e)},ro.prototype.w=function(){var t={providerId:this.providerId,signInMethod:this.signInMethod};return this.idToken&&(t.oauthIdToken=this.idToken),this.accessToken&&(t.oauthAccessToken=this.accessToken),this.secret&&(t.oauthTokenSecret=this.secret),this.nonce&&(t.nonce=this.nonce),this.a&&(t.pendingToken=this.a),t},so.prototype.Ka=function(t){return this.Jb=ct(t),this},w(uo,so),w(co,so),co.prototype.Ca=function(t){return K(this.a,t)||this.a.push(t),this},co.prototype.Rb=function(){return X(this.a)},co.prototype.credential=function(t,e){e=m(t)?{idToken:t.idToken||null,accessToken:t.accessToken||null,nonce:t.rawNonce||null}:{idToken:t||null,accessToken:e||null};if(!e.idToken&&!e.accessToken)throw new T("argument-error","credential failed: must provide the ID token and/or the access token.");return new ro(this.providerId,e,this.providerId)},w(ho,co),Fi(ho,"PROVIDER_ID","facebook.com"),Fi(ho,"FACEBOOK_SIGN_IN_METHOD","facebook.com"),w(fo,co),Fi(fo,"PROVIDER_ID","github.com"),Fi(fo,"GITHUB_SIGN_IN_METHOD","github.com"),w(vo,co),Fi(vo,"PROVIDER_ID","google.com"),Fi(vo,"GOOGLE_SIGN_IN_METHOD","google.com"),w(go,so),Fi(go,"PROVIDER_ID","twitter.com"),Fi(go,"TWITTER_SIGN_IN_METHOD","twitter.com"),yo.prototype.ka=function(t){return this.signInMethod==Io.EMAIL_LINK_SIGN_IN_METHOD?Js(t,Is,{email:this.a,oobCode:this.f}):Js(t,Ks,{email:this.a,password:this.f})},yo.prototype.b=function(t,e){return this.signInMethod==Io.EMAIL_LINK_SIGN_IN_METHOD?Js(t,Ts,{idToken:e,email:this.a,oobCode:this.f}):Js(t,xs,{idToken:e,email:this.a,password:this.f})},yo.prototype.c=function(t,e){return to(this.ka(t),e)},yo.prototype.w=function(){return{email:this.a,password:this.f,signInMethod:this.signInMethod}},qi(Io,{PROVIDER_ID:"password"}),qi(Io,{EMAIL_LINK_SIGN_IN_METHOD:"emailLink"}),qi(Io,{EMAIL_PASSWORD_SIGN_IN_METHOD:"password"}),Ao.prototype.ka=function(t){return t.gb(So(this))},Ao.prototype.b=function(t,e){var n=So(this);return n.idToken=e,Js(t,Bs,n)},Ao.prototype.c=function(t,e){var n=So(this);return n.operation="REAUTH",to(t=Js(t,Ws,n),e)},Ao.prototype.w=function(){var t={providerId:"phone"};return this.a.fb&&(t.verificationId=this.a.fb),this.a.eb&&(t.verificationCode=this.a.eb),this.a.La&&(t.temporaryProof=this.a.La),this.a.ea&&(t.phoneNumber=this.a.ea),t},No.prototype.gb=function(i,r){var o=this.a.a;return ye(r.verify()).then(function(e){if("string"!=typeof e)throw new T("argument-error","An implementation of firebase.auth.ApplicationVerifier.prototype.verify() must return a firebase.Promise that resolves with a string.");if("recaptcha"!==r.type)throw new T("argument-error",'Only firebase.auth.ApplicationVerifiers with type="recaptcha" are currently supported.');var t=m(i)?i.session:null,n=m(i)?i.phoneNumber:i,t=t&&t.type==$r?t.Ha().then(function(t){return Js(o,js,{idToken:t,phoneEnrollmentInfo:{phoneNumber:n,recaptchaToken:e}}).then(function(t){return t.phoneSessionInfo.sessionInfo})}):t&&t.type==Zr?t.Ha().then(function(t){return t={mfaPendingCredential:t,mfaEnrollmentId:i.multiFactorHint&&i.multiFactorHint.uid||i.multiFactorUid,phoneSignInInfo:{recaptchaToken:e}},Js(o,Us,t).then(function(t){return t.phoneResponseInfo.sessionInfo})}):Js(o,Ps,{phoneNumber:n,recaptchaToken:e});return t.then(function(t){return"function"==typeof r.reset&&r.reset(),t},function(t){throw"function"==typeof r.reset&&r.reset(),t})})},qi(No,{PROVIDER_ID:"phone"}),qi(No,{PHONE_SIGN_IN_METHOD:"phone"}),Ro.prototype.getUid=function(){var t=[];return t.push(this.c),this.b&&t.push(this.b),this.f&&t.push(this.f),this.h&&t.push(this.h),t.join("-")},Ro.prototype.T=function(){return this.h},Ro.prototype.w=function(){return{type:this.c,eventId:this.b,urlResponse:this.g,sessionId:this.f,postBody:this.i,tenantId:this.h,error:this.a&&this.a.w()}};var Lo,xo=null;function Mo(t){var e="unauthorized-domain",n=void 0,i=Cn(t);t=i.a,"chrome-extension"==(i=i.c)?n=jt("This chrome extension ID (chrome-extension://%s) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab.",t):"http"==i||"https"==i?n=jt("This domain (%s) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab.",t):e="operation-not-supported-in-this-environment",T.call(this,e,n)}function jo(t,e,n){T.call(this,t,n),(t=e||{}).Kb&&Fi(this,"email",t.Kb),t.ea&&Fi(this,"phoneNumber",t.ea),t.credential&&Fi(this,"credential",t.credential),t.$b&&Fi(this,"tenantId",t.$b)}function Uo(t){if(t.code){var e=t.code||"";0==e.indexOf(k)&&(e=e.substring(k.length));var n={credential:Oo(t),$b:t.tenantId};if(t.email)n.Kb=t.email;else if(t.phoneNumber)n.ea=t.phoneNumber;else if(!n.credential)return new T(e,t.message||void 0);return new jo(e,n,t.message)}return null}function Vo(){}function Fo(t){return t.c||(t.c=t.b())}function qo(){}function Ho(t){if(t.f||"undefined"!=typeof XMLHttpRequest||"undefined"==typeof ActiveXObject)return t.f;for(var e=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"],n=0;n=function t(e){return e.c||(e.a?t(e.a):(D("Root logger has no level set."),null))}(this).value)for(v(e)&&(e=e()),t=new Wo(t,String(e),this.f),n&&(t.a=n),n=this;n;)n=n.a};var Qo,ta={},ea=null;function na(t){var e,n,i;return ea||(ea=new Xo(""),(ta[""]=ea).c=$o),(e=ta[t])||(e=new Xo(t),i=t.lastIndexOf("."),n=t.substr(i+1),(i=na(t.substr(0,i))).b||(i.b={}),(i.b[n]=e).a=i,ta[t]=e),e}function ia(t,e){t&&t.log(Zo,e,void 0)}function ra(t){this.f=t}function oa(t){fn.call(this),this.u=t,this.h=void 0,this.readyState=aa,this.status=0,this.responseType=this.responseText=this.response=this.statusText="",this.onreadystatechange=null,this.l=new Headers,this.b=null,this.s="GET",this.f="",this.a=!1,this.i=na("goog.net.FetchXmlHttp"),this.m=this.c=this.g=null}w(ra,Vo),ra.prototype.a=function(){return new oa(this.f)},ra.prototype.b=(Qo={},function(){return Qo}),w(oa,fn);var aa=0;function sa(t){t.c.read().then(t.pc.bind(t)).catch(t.Va.bind(t))}function ua(t){t.readyState=4,t.g=null,t.c=null,t.m=null,ca(t)}function ca(t){t.onreadystatechange&&t.onreadystatechange.call(t)}function ha(t){fn.call(this),this.headers=new wn,this.D=t||null,this.c=!1,this.C=this.a=null,this.h=this.P=this.l="",this.f=this.N=this.i=this.J=!1,this.g=0,this.s=null,this.m=la,this.u=this.S=!1}(t=oa.prototype).open=function(t,e){if(this.readyState!=aa)throw this.abort(),Error("Error reopening a connection");this.s=t,this.f=e,this.readyState=1,ca(this)},t.send=function(t){if(1!=this.readyState)throw this.abort(),Error("need to call open() first. ");this.a=!0;var e={headers:this.l,method:this.s,credentials:this.h,cache:void 0};t&&(e.body=t),this.u.fetch(new Request(this.f,e)).then(this.uc.bind(this),this.Va.bind(this))},t.abort=function(){this.response=this.responseText="",this.l=new Headers,this.status=0,this.c&&this.c.cancel("Request was aborted."),1<=this.readyState&&this.a&&4!=this.readyState&&(this.a=!1,ua(this)),this.readyState=aa},t.uc=function(t){this.a&&(this.g=t,this.b||(this.status=this.g.status,this.statusText=this.g.statusText,this.b=t.headers,this.readyState=2,ca(this)),this.a&&(this.readyState=3,ca(this),this.a&&("arraybuffer"===this.responseType?t.arrayBuffer().then(this.sc.bind(this),this.Va.bind(this)):void 0!==l.ReadableStream&&"body"in t?(this.response=this.responseText="",this.c=t.body.getReader(),this.m=new TextDecoder,sa(this)):t.text().then(this.tc.bind(this),this.Va.bind(this)))))},t.pc=function(t){var e;this.a&&((e=this.m.decode(t.value||new Uint8Array(0),{stream:!t.done}))&&(this.response=this.responseText+=e),(t.done?ua:ca)(this),3==this.readyState&&sa(this))},t.tc=function(t){this.a&&(this.response=this.responseText=t,ua(this))},t.sc=function(t){this.a&&(this.response=t,ua(this))},t.Va=function(t){var e=this.i;e&&e.log(zo,"Failed to fetch url "+this.f,t instanceof Error?t:Error(t)),this.a&&ua(this)},t.setRequestHeader=function(t,e){this.l.append(t,e)},t.getResponseHeader=function(t){return this.b?this.b.get(t.toLowerCase())||"":((t=this.i)&&t.log(zo,"Attempting to get response header but no headers have been received for url: "+this.f,void 0),"")},t.getAllResponseHeaders=function(){if(!this.b){var t=this.i;return t&&t.log(zo,"Attempting to get all response headers but no headers have been received for url: "+this.f,void 0),""}for(var t=[],e=this.b.entries(),n=e.next();!n.done;)n=n.value,t.push(n[0]+": "+n[1]),n=e.next();return t.join("\r\n")},Object.defineProperty(oa.prototype,"withCredentials",{get:function(){return"include"===this.h},set:function(t){this.h=t?"include":"same-origin"}}),w(ha,fn);var la="";ha.prototype.b=na("goog.net.XhrIo");var fa=/^https?$/i,da=["POST","PUT"];function pa(e,t,n,i,r){if(e.a)throw Error("[goog.net.XhrIo] Object is active with another request="+e.l+"; newUri="+t);n=n?n.toUpperCase():"GET",e.l=t,e.h="",e.P=n,e.J=!1,e.c=!0,e.a=(e.D||Lo).a(),e.C=e.D?Fo(e.D):Fo(Lo),e.a.onreadystatechange=b(e.Wb,e);try{ia(e.b,Ea(e,"Opening Xhr")),e.N=!0,e.a.open(n,String(t),!0),e.N=!1}catch(t){return ia(e.b,Ea(e,"Error opening Xhr: "+t.message)),void ma(e,t)}t=i||"";var o,a=new wn(e.headers);r&&function(t,e){if(t.forEach&&"function"==typeof t.forEach)t.forEach(e,void 0);else if(p(t)||"string"==typeof t)V(t,e,void 0);else for(var n=yn(t),i=bn(t),r=i.length,o=0;o>>7|r<<25)^(r>>>18|r<<14)^r>>>3)|0,a=(0|n[e-7])+((i>>>17|i<<15)^(i>>>19|i<<13)^i>>>10)|0;n[e]=o+a|0}i=0|t.a[0],r=0|t.a[1];var s=0|t.a[2],u=0|t.a[3],c=0|t.a[4],h=0|t.a[5],l=0|t.a[6];for(o=0|t.a[7],e=0;e<64;e++){var f=((i>>>2|i<<30)^(i>>>13|i<<19)^(i>>>22|i<<10))+(i&r^i&s^r&s)|0;a=(o=o+((c>>>6|c<<26)^(c>>>11|c<<21)^(c>>>25|c<<7))|0)+((a=(a=c&h^~c&l)+(0|Zu[e])|0)+(0|n[e])|0)|0,o=l,l=h,h=c,c=u+a|0,u=s,s=r,r=i,i=a+f|0}t.a[0]=t.a[0]+i|0,t.a[1]=t.a[1]+r|0,t.a[2]=t.a[2]+s|0,t.a[3]=t.a[3]+u|0,t.a[4]=t.a[4]+c|0,t.a[5]=t.a[5]+h|0,t.a[6]=t.a[6]+l|0,t.a[7]=t.a[7]+o|0}function uc(t,e,n){void 0===n&&(n=e.length);var i=0,r=t.c;if("string"==typeof e)for(;i>r&255;return q(t,function(t){return 1<(t=t.toString(16)).length?t:"0"+t}).join("")}function vc(t,e){for(var n=0;nt.f&&(t.a=t.f),e)}function oh(t){this.f=t,this.b=this.a=null,this.c=Date.now()}function ah(t,e){void 0===e&&(e=t.b?(e=t.b).a-e.g:0),t.c=Date.now()+1e3*e}function sh(t,e){t.b=Lr(e[Ka]||""),t.a=e.refreshToken,ah(t,void 0!==(e=e.expiresIn)?Number(e):void 0)}function uh(e,t){return i=e.f,r=t,new fe(function(e,n){"refresh_token"==r.grant_type&&r.refresh_token||"authorization_code"==r.grant_type&&r.code?Za(i,i.l+"?key="+encodeURIComponent(i.c),function(t){t?t.error?n(zs(t)):t.access_token&&t.refresh_token?e(t):n(new T("internal-error")):n(new T("network-request-failed"))},"POST",Hn(r).toString(),i.g,i.m.get()):n(new T("internal-error"))}).then(function(t){return e.b=Lr(t.access_token),e.a=t.refresh_token,ah(e,t.expires_in),{accessToken:e.b.toString(),refreshToken:e.a}}).o(function(t){throw"auth/user-token-expired"==t.code&&(e.a=null),t});var i,r}function ch(t,e){this.a=t||null,this.b=e||null,qi(this,{lastSignInTime:Li(e||null),creationTime:Li(t||null)})}function hh(t,e,n,i,r,o){qi(this,{uid:t,displayName:i||null,photoURL:r||null,email:n||null,phoneNumber:o||null,providerId:e})}function lh(t,e,n){this.N=[],this.l=t.apiKey,this.m=t.appName,this.s=t.authDomain||null;var i,r=Zl.default.SDK_VERSION?gi(Zl.default.SDK_VERSION):null;this.a=new qa(this.l,_(A),r),(this.u=t.emulatorConfig||null)&&Ya(this.a,this.u),this.h=new oh(this.a),wh(this,e[Ka]),sh(this.h,e),Fi(this,"refreshToken",this.h.a),Eh(this,n||{}),fn.call(this),this.P=!1,this.s&&Ii()&&(this.b=xc(this.s,this.l,this.m,this.u)),this.W=[],this.i=null,this.D=(i=this,new ih(function(){return i.I(!0)},function(t){return!(!t||"auth/network-request-failed"!=t.code)},function(){var t=i.h.c-Date.now()-3e5;return 0this.c-3e4?this.a?uh(this,{grant_type:"refresh_token",refresh_token:this.a}):ye(null):ye({accessToken:this.b.toString(),refreshToken:this.a})},ch.prototype.w=function(){return{lastLoginAt:this.b,createdAt:this.a}},w(lh,fn),lh.prototype.xa=function(t){this.za=t,Ja(this.a,t)},lh.prototype.la=function(){return this.za},lh.prototype.Ga=function(){return X(this.aa)},lh.prototype.ib=function(){this.D.b&&(this.D.stop(),this.D.start())},Fi(lh.prototype,"providerId","firebase"),(t=lh.prototype).reload=function(){var t=this;return Vh(this,kh(this).then(function(){return Rh(t).then(function(){return Ih(t)}).then(Ah)}))},t.oc=function(t){return this.I(t).then(function(t){return new Bc(t)})},t.I=function(t){var e=this;return Vh(this,kh(this).then(function(){return e.h.getToken(t)}).then(function(t){if(!t)throw new T("internal-error");return t.accessToken!=e.Aa&&(wh(e,t.accessToken),e.dispatchEvent(new th("tokenChanged"))),Oh(e,"refreshToken",t.refreshToken),t.accessToken}))},t.Kc=function(t){if(!(t=t.users)||!t.length)throw new T("internal-error");Eh(this,{uid:(t=t[0]).localId,displayName:t.displayName,photoURL:t.photoUrl,email:t.email,emailVerified:!!t.emailVerified,phoneNumber:t.phoneNumber,lastLoginAt:t.lastLoginAt,createdAt:t.createdAt,tenantId:t.tenantId});for(var e,n=(e=(e=t).providerUserInfo)&&e.length?q(e,function(t){return new hh(t.rawId,t.providerId,t.email,t.displayName,t.photoUrl,t.phoneNumber)}):[],i=0;i=xl.length)throw new T("internal-error","Argument validator received an unsupported number of arguments.");n=xl[r],i=(i?"":n+" argument ")+(e.name?'"'+e.name+'" ':"")+"must be "+e.K+".";break t}i=null}}if(i)throw new T("argument-error",t+" failed: "+i)}(t=kl.prototype).Ia=function(){var e=this;return this.f||(this.f=Rl(this,ye().then(function(){if(Ti()&&!hi())return si();throw new T("operation-not-supported-in-this-environment","RecaptchaVerifier is only supported in a browser HTTP/HTTPS environment.")}).then(function(){return e.m.g(e.u())}).then(function(t){return e.g=t,Js(e.s,Rs,{})}).then(function(t){e.a[_l]=t.recaptchaSiteKey}).o(function(t){throw e.f=null,t})))},t.render=function(){Dl(this);var n=this;return Rl(this,this.Ia().then(function(){var t,e;return null===n.c&&(e=n.v,n.i||(t=te(e),e=oe("DIV"),t.appendChild(e)),n.c=n.g.render(e,n.a)),n.c}))},t.verify=function(){Dl(this);var r=this;return Rl(this,this.render().then(function(e){return new fe(function(n){var i,t=r.g.getResponse(e);t?n(t):(r.l.push(i=function(t){var e;t&&(e=i,B(r.l,function(t){return t==e}),n(t))}),r.i&&r.g.execute(r.c))})}))},t.reset=function(){Dl(this),null!==this.c&&this.g.reset(this.c)},t.clear=function(){Dl(this),this.J=!0,this.m.c();for(var t,e=0;es[0]&&e[1]>6|192:(55296==(64512&i)&&r+1>18|240,e[n++]=i>>12&63|128):e[n++]=i>>12|224,e[n++]=i>>6&63|128),e[n++]=63&i|128)}return e}function u(t){return function(t){t=i(t);return o.encodeByteArray(t,!0)}(t).replace(/\./g,"")}var o={byteToCharMap_:null,charToByteMap_:null,byteToCharMapWebSafe_:null,charToByteMapWebSafe_:null,ENCODED_VALS_BASE:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",get ENCODED_VALS(){return this.ENCODED_VALS_BASE+"+/="},get ENCODED_VALS_WEBSAFE(){return this.ENCODED_VALS_BASE+"-_."},HAS_NATIVE_SUPPORT:"function"==typeof atob,encodeByteArray:function(t,e){if(!Array.isArray(t))throw Error("encodeByteArray takes an array as a parameter");this.init_();for(var n=e?this.byteToCharMapWebSafe_:this.byteToCharMap_,r=[],i=0;i>6,c=63&c;u||(c=64,s||(h=64)),r.push(n[o>>2],n[(3&o)<<4|a>>4],n[h],n[c])}return r.join("")},encodeString:function(t,e){return this.HAS_NATIVE_SUPPORT&&!e?btoa(t):this.encodeByteArray(i(t),e)},decodeString:function(t,e){return this.HAS_NATIVE_SUPPORT&&!e?atob(t):function(t){for(var e=[],n=0,r=0;n>10)),e[r++]=String.fromCharCode(56320+(1023&i))):(o=t[n++],s=t[n++],e[r++]=String.fromCharCode((15&a)<<12|(63&o)<<6|63&s))}return e.join("")}(this.decodeStringToByteArray(t,e))},decodeStringToByteArray:function(t,e){this.init_();for(var n=e?this.charToByteMapWebSafe_:this.charToByteMap_,r=[],i=0;i>4),64!==a&&(r.push(s<<4&240|a>>2),64!==u&&r.push(a<<6&192|u))}return r},init_:function(){if(!this.byteToCharMap_){this.byteToCharMap_={},this.charToByteMap_={},this.byteToCharMapWebSafe_={},this.charToByteMapWebSafe_={};for(var t=0;t=this.ENCODED_VALS_BASE.length&&(this.charToByteMap_[this.ENCODED_VALS_WEBSAFE.charAt(t)]=t,this.charToByteMapWebSafe_[this.ENCODED_VALS.charAt(t)]=t)}}};function h(){return"undefined"!=typeof navigator&&"string"==typeof navigator.userAgent?navigator.userAgent:""}function c(){return!function(){try{return"[object process]"===Object.prototype.toString.call(global.process)}catch(t){return}}()&&navigator.userAgent.includes("Safari")&&!navigator.userAgent.includes("Chrome")}var l,f="FirebaseError",d=(n(p,l=Error),p);function p(t,e,n){e=l.call(this,e)||this;return e.code=t,e.customData=n,e.name=f,Object.setPrototypeOf(e,p.prototype),Error.captureStackTrace&&Error.captureStackTrace(e,m.prototype.create),e}var m=(v.prototype.create=function(t){for(var e=[],n=1;n"})):"Error",t=this.serviceName+": "+t+" ("+o+").";return new d(o,t,i)},v);function v(t,e,n){this.service=t,this.serviceName=e,this.errors=n}var w,b=/\{\$([^}]+)}/g;function E(t){return t&&t._delegate?t._delegate:t}(k=w=w||{})[k.DEBUG=0]="DEBUG",k[k.VERBOSE=1]="VERBOSE",k[k.INFO=2]="INFO",k[k.WARN=3]="WARN",k[k.ERROR=4]="ERROR",k[k.SILENT=5]="SILENT";function T(t,e){for(var n=[],r=2;r=t.length?void 0:t)&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}var k,R="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},x={},O=R||self;function L(){}function P(t){var e=typeof t;return"array"==(e="object"!=e?e:t?Array.isArray(t)?"array":e:"null")||"object"==e&&"number"==typeof t.length}function M(t){var e=typeof t;return"object"==e&&null!=t||"function"==e}var F="closure_uid_"+(1e9*Math.random()>>>0),V=0;function U(t,e,n){return t.call.apply(t.bind,arguments)}function q(e,n,t){if(!e)throw Error();if(2parseFloat(yt)){at=String(gt);break t}}at=yt}var mt={};function vt(){return t=function(){for(var t=0,e=J(String(at)).split("."),n=J("9").split("."),r=Math.max(e.length,n.length),i=0;0==t&&i>>0);function qt(e){return"function"==typeof e?e:(e[Ut]||(e[Ut]=function(t){return e.handleEvent(t)}),e[Ut])}function Bt(){G.call(this),this.i=new Nt(this),(this.P=this).I=null}function jt(t,e){var n,r=t.I;if(r)for(n=[];r;r=r.I)n.push(r);if(t=t.P,r=e.type||e,"string"==typeof e?e=new Et(e,t):e instanceof Et?e.target=e.target||t:(s=e,ot(e=new Et(r,t),s)),s=!0,n)for(var i=n.length-1;0<=i;i--)var o=e.g=n[i],s=Kt(o,r,!0,e)&&s;if(s=Kt(o=e.g=t,r,!0,e)&&s,s=Kt(o,r,!1,e)&&s,n)for(i=0;io.length?Pe:(o=o.substr(a,s),i.C=a+s,o)))==Pe){4==e&&(t.o=4,be(14),u=!1),de(t.j,t.m,null,"[Incomplete Response]");break}if(r==Le){t.o=4,be(15),de(t.j,t.m,n,"[Invalid Chunk]"),u=!1;break}de(t.j,t.m,r,null),Qe(t,r)}Ve(t)&&r!=Pe&&r!=Le&&(t.h.g="",t.C=0),4!=e||0!=n.length||t.h.h||(t.o=1,be(16),u=!1),t.i=t.i&&u,u?0>4&15).toString(16)+(15&t).toString(16)}$e.prototype.toString=function(){var t=[],e=this.j;e&&t.push(an(e,cn,!0),":");var n=this.i;return!n&&"file"!=e||(t.push("//"),(e=this.s)&&t.push(an(e,cn,!0),"@"),t.push(encodeURIComponent(String(n)).replace(/%25([0-9a-fA-F]{2})/g,"%$1")),null!=(n=this.m)&&t.push(":",String(n))),(n=this.l)&&(this.i&&"/"!=n.charAt(0)&&t.push("/"),t.push(an(n,"/"==n.charAt(0)?ln:hn,!0))),(n=this.h.toString())&&t.push("?",n),(n=this.o)&&t.push("#",an(n,dn)),t.join("")};var cn=/[#\/\?@]/g,hn=/[#\?:]/g,ln=/[#\?]/g,fn=/[#\?@]/g,dn=/#/g;function pn(t,e){this.h=this.g=null,this.i=t||null,this.j=!!e}function yn(n){n.g||(n.g=new ze,n.h=0,n.i&&function(t,e){if(t){t=t.split("&");for(var n=0;n2*t.i&&We(t)))}function mn(t,e){return yn(t),e=wn(t,e),Ye(t.g.h,e)}function vn(t,e,n){gn(t,e),0=t.j}function Sn(t){return t.h?1:t.g?t.g.size:0}function An(t,e){return t.h?t.h==e:t.g&&t.g.has(e)}function Dn(t,e){t.g?t.g.add(e):t.h=e}function Nn(t,e){t.h&&t.h==e?t.h=null:t.g&&t.g.has(e)&&t.g.delete(e)}function Cn(t){var e,n;if(null!=t.h)return t.i.concat(t.h.D);if(null==t.g||0===t.g.size)return Y(t.i);var r=t.i;try{for(var i=C(t.g.values()),o=i.next();!o.done;o=i.next())var s=o.value,r=r.concat(s.D)}catch(t){e={error:t}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}return r}function kn(){}function Rn(){this.g=new kn}function xn(t,e,n,r,i){try{e.onload=null,e.onerror=null,e.onabort=null,e.ontimeout=null,i(r)}catch(t){}}function On(t){this.l=t.$b||null,this.j=t.ib||!1}function Ln(t,e){Bt.call(this),this.D=t,this.u=e,this.m=void 0,this.readyState=Pn,this.status=0,this.responseType=this.responseText=this.response=this.statusText="",this.onreadystatechange=null,this.v=new Headers,this.h=null,this.C="GET",this.B="",this.g=!1,this.A=this.j=this.l=null}En.prototype.cancel=function(){var e,t;if(this.i=Cn(this),this.h)this.h.cancel(),this.h=null;else if(this.g&&0!==this.g.size){try{for(var n=C(this.g.values()),r=n.next();!r.done;r=n.next())r.value.cancel()}catch(t){e={error:t}}finally{try{r&&!r.done&&(t=n.return)&&t.call(n)}finally{if(e)throw e.error}}this.g.clear()}},kn.prototype.stringify=function(t){return O.JSON.stringify(t,void 0)},kn.prototype.parse=function(t){return O.JSON.parse(t,void 0)},K(On,_e),On.prototype.g=function(){return new Ln(this.l,this.j)},On.prototype.i=(Tn={},function(){return Tn}),K(Ln,Bt);var Pn=0;function Mn(t){t.j.read().then(t.Sa.bind(t)).catch(t.ha.bind(t))}function Fn(t){t.readyState=4,t.l=null,t.j=null,t.A=null,Vn(t)}function Vn(t){t.onreadystatechange&&t.onreadystatechange.call(t)}(k=Ln.prototype).open=function(t,e){if(this.readyState!=Pn)throw this.abort(),Error("Error reopening a connection");this.C=t,this.B=e,this.readyState=1,Vn(this)},k.send=function(t){if(1!=this.readyState)throw this.abort(),Error("need to call open() first. ");this.g=!0;var e={headers:this.v,method:this.C,credentials:this.m,cache:void 0};t&&(e.body=t),(this.D||O).fetch(new Request(this.B,e)).then(this.Va.bind(this),this.ha.bind(this))},k.abort=function(){this.response=this.responseText="",this.v=new Headers,this.status=0,this.j&&this.j.cancel("Request was aborted."),1<=this.readyState&&this.g&&4!=this.readyState&&(this.g=!1,Fn(this)),this.readyState=Pn},k.Va=function(t){if(this.g&&(this.l=t,this.h||(this.status=this.l.status,this.statusText=this.l.statusText,this.h=t.headers,this.readyState=2,Vn(this)),this.g&&(this.readyState=3,Vn(this),this.g)))if("arraybuffer"===this.responseType)t.arrayBuffer().then(this.Ta.bind(this),this.ha.bind(this));else if(void 0!==O.ReadableStream&&"body"in t){if(this.j=t.body.getReader(),this.u){if(this.responseType)throw Error('responseType must be empty for "streamBinaryChunks" mode responses.');this.response=[]}else this.response=this.responseText="",this.A=new TextDecoder;Mn(this)}else t.text().then(this.Ua.bind(this),this.ha.bind(this))},k.Sa=function(t){var e;this.g&&(this.u&&t.value?this.response.push(t.value):this.u||(e=t.value||new Uint8Array(0),(e=this.A.decode(e,{stream:!t.done}))&&(this.response=this.responseText+=e)),(t.done?Fn:Vn)(this),3==this.readyState&&Mn(this))},k.Ua=function(t){this.g&&(this.response=this.responseText=t,Fn(this))},k.Ta=function(t){this.g&&(this.response=t,Fn(this))},k.ha=function(){this.g&&Fn(this)},k.setRequestHeader=function(t,e){this.v.append(t,e)},k.getResponseHeader=function(t){return this.h&&this.h.get(t.toLowerCase())||""},k.getAllResponseHeaders=function(){if(!this.h)return"";for(var t=[],e=this.h.entries(),n=e.next();!n.done;)n=n.value,t.push(n[0]+": "+n[1]),n=e.next();return t.join("\r\n")},Object.defineProperty(Ln.prototype,"withCredentials",{get:function(){return"include"===this.m},set:function(t){this.m=t?"include":"same-origin"}});var Un=O.JSON.parse;function qn(t){Bt.call(this),this.headers=new ze,this.u=t||null,this.h=!1,this.C=this.g=null,this.H="",this.m=0,this.j="",this.l=this.F=this.v=this.D=!1,this.B=0,this.A=null,this.J=Bn,this.K=this.L=!1}K(qn,Bt);var Bn="",jn=/^https?$/i,Kn=["POST","PUT"];function Gn(t){return"content-type"==t.toLowerCase()}function Qn(t,e){t.h=!1,t.g&&(t.l=!0,t.g.abort(),t.l=!1),t.j=e,t.m=5,Hn(t),Wn(t)}function Hn(t){t.D||(t.D=!0,jt(t,"complete"),jt(t,"error"))}function zn(t){if(t.h&&void 0!==x&&(!t.C[1]||4!=Xn(t)||2!=t.ba()))if(t.v&&4==Xn(t))ie(t.Fa,0,t);else if(jt(t,"readystatechange"),4==Xn(t)){t.h=!1;try{var e,n,r,i,o=t.ba();t:switch(o){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var s=!0;break t;default:s=!1}if((e=s)||((n=0===o)&&(!(i=String(t.H).match(Xe)[1]||null)&&O.self&&O.self.location&&(i=(r=O.self.location.protocol).substr(0,r.length-1)),n=!jn.test(i?i.toLowerCase():"")),e=n),e)jt(t,"complete"),jt(t,"success");else{t.m=6;try{var a=2=r.i.j-(r.m?1:0)||(r.m?(r.l=i.D.concat(r.l),0):1==r.G||2==r.G||r.C>=(r.Xa?0:r.Ya)||(r.m=Te(B(r.Ha,r,i),yr(r,r.C)),r.C++,0))))&&(2!=s||!hr(t)))switch(o&&0e.length?1:0},vi),ci=(n(mi,ui=R),mi.prototype.construct=function(t,e,n){return new mi(t,e,n)},mi.prototype.canonicalString=function(){return this.toArray().join("/")},mi.prototype.toString=function(){return this.canonicalString()},mi.fromString=function(){for(var t=[],e=0;et.length&&zr(),void 0===n?n=t.length-e:n>t.length-e&&zr(),this.segments=t,this.offset=e,this.len=n}di.EMPTY_BYTE_STRING=new di("");var wi=new RegExp(/^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d(?:\.(\d+))?Z$/);function bi(t){if(Wr(!!t),"string"!=typeof t)return{seconds:Ei(t.seconds),nanos:Ei(t.nanos)};var e=0,n=wi.exec(t);Wr(!!n),n[1]&&(n=((n=n[1])+"000000000").substr(0,9),e=Number(n));t=new Date(t);return{seconds:Math.floor(t.getTime()/1e3),nanos:e}}function Ei(t){return"number"==typeof t?t:"string"==typeof t?Number(t):0}function Ti(t){return"string"==typeof t?di.fromBase64String(t):di.fromUint8Array(t)}function Ii(t){return"server_timestamp"===(null===(t=((null===(t=null==t?void 0:t.mapValue)||void 0===t?void 0:t.fields)||{}).__type__)||void 0===t?void 0:t.stringValue)}function _i(t){t=bi(t.mapValue.fields.__local_write_time__.timestampValue);return new ti(t.seconds,t.nanos)}function Si(t){return null==t}function Ai(t){return 0===t&&1/t==-1/0}function Di(t){return"number"==typeof t&&Number.isInteger(t)&&!Ai(t)&&t<=Number.MAX_SAFE_INTEGER&&t>=Number.MIN_SAFE_INTEGER}var Ni=(Ci.fromPath=function(t){return new Ci(ci.fromString(t))},Ci.fromName=function(t){return new Ci(ci.fromString(t).popFirst(5))},Ci.prototype.hasCollectionId=function(t){return 2<=this.path.length&&this.path.get(this.path.length-2)===t},Ci.prototype.isEqual=function(t){return null!==t&&0===ci.comparator(this.path,t.path)},Ci.prototype.toString=function(){return this.path.toString()},Ci.comparator=function(t,e){return ci.comparator(t.path,e.path)},Ci.isDocumentKey=function(t){return t.length%2==0},Ci.fromSegments=function(t){return new Ci(new ci(t.slice()))},Ci);function Ci(t){this.path=t}function ki(t){return"nullValue"in t?0:"booleanValue"in t?1:"integerValue"in t||"doubleValue"in t?2:"timestampValue"in t?3:"stringValue"in t?5:"bytesValue"in t?6:"referenceValue"in t?7:"geoPointValue"in t?8:"arrayValue"in t?9:"mapValue"in t?Ii(t)?4:10:zr()}function Ri(r,i){var t,e,n=ki(r);if(n!==ki(i))return!1;switch(n){case 0:return!0;case 1:return r.booleanValue===i.booleanValue;case 4:return _i(r).isEqual(_i(i));case 3:return function(t){if("string"==typeof r.timestampValue&&"string"==typeof t.timestampValue&&r.timestampValue.length===t.timestampValue.length)return r.timestampValue===t.timestampValue;var e=bi(r.timestampValue),t=bi(t.timestampValue);return e.seconds===t.seconds&&e.nanos===t.nanos}(i);case 5:return r.stringValue===i.stringValue;case 6:return e=i,Ti(r.bytesValue).isEqual(Ti(e.bytesValue));case 7:return r.referenceValue===i.referenceValue;case 8:return t=i,Ei((e=r).geoPointValue.latitude)===Ei(t.geoPointValue.latitude)&&Ei(e.geoPointValue.longitude)===Ei(t.geoPointValue.longitude);case 2:return function(t,e){if("integerValue"in t&&"integerValue"in e)return Ei(t.integerValue)===Ei(e.integerValue);if("doubleValue"in t&&"doubleValue"in e){t=Ei(t.doubleValue),e=Ei(e.doubleValue);return t===e?Ai(t)===Ai(e):isNaN(t)&&isNaN(e)}return!1}(r,i);case 9:return Jr(r.arrayValue.values||[],i.arrayValue.values||[],Ri);case 10:return function(){var t,e=r.mapValue.fields||{},n=i.mapValue.fields||{};if(ii(e)!==ii(n))return!1;for(t in e)if(e.hasOwnProperty(t)&&(void 0===n[t]||!Ri(e[t],n[t])))return!1;return!0}();default:return zr()}}function xi(t,e){return void 0!==(t.values||[]).find(function(t){return Ri(t,e)})}function Oi(t,e){var n,r,i,o=ki(t),s=ki(e);if(o!==s)return $r(o,s);switch(o){case 0:return 0;case 1:return $r(t.booleanValue,e.booleanValue);case 2:return r=e,i=Ei(t.integerValue||t.doubleValue),r=Ei(r.integerValue||r.doubleValue),i":return 0=":return 0<=t;default:return zr()}},to.prototype.g=function(){return 0<=["<","<=",">",">=","!=","not-in"].indexOf(this.op)},to);function to(t,e,n){var r=this;return(r=Ji.call(this)||this).field=t,r.op=e,r.value=n,r}var eo,no,ro,io=(n(co,ro=Zi),co.prototype.matches=function(t){t=Ni.comparator(t.key,this.key);return this.m(t)},co),oo=(n(uo,no=Zi),uo.prototype.matches=function(e){return this.keys.some(function(t){return t.isEqual(e.key)})},uo),so=(n(ao,eo=Zi),ao.prototype.matches=function(e){return!this.keys.some(function(t){return t.isEqual(e.key)})},ao);function ao(t,e){var n=this;return(n=eo.call(this,t,"not-in",e)||this).keys=ho(0,e),n}function uo(t,e){var n=this;return(n=no.call(this,t,"in",e)||this).keys=ho(0,e),n}function co(t,e,n){var r=this;return(r=ro.call(this,t,e,n)||this).key=Ni.fromName(n.referenceValue),r}function ho(t,e){return((null===(e=e.arrayValue)||void 0===e?void 0:e.values)||[]).map(function(t){return Ni.fromName(t.referenceValue)})}var lo,fo,po,yo,go=(n(_o,yo=Zi),_o.prototype.matches=function(t){t=t.data.field(this.field);return Vi(t)&&xi(t.arrayValue,this.value)},_o),mo=(n(Io,po=Zi),Io.prototype.matches=function(t){t=t.data.field(this.field);return null!==t&&xi(this.value.arrayValue,t)},Io),vo=(n(To,fo=Zi),To.prototype.matches=function(t){if(xi(this.value.arrayValue,{nullValue:"NULL_VALUE"}))return!1;t=t.data.field(this.field);return null!==t&&!xi(this.value.arrayValue,t)},To),wo=(n(Eo,lo=Zi),Eo.prototype.matches=function(t){var e=this,t=t.data.field(this.field);return!(!Vi(t)||!t.arrayValue.values)&&t.arrayValue.values.some(function(t){return xi(e.value.arrayValue,t)})},Eo),bo=function(t,e){this.position=t,this.before=e};function Eo(t,e){return lo.call(this,t,"array-contains-any",e)||this}function To(t,e){return fo.call(this,t,"not-in",e)||this}function Io(t,e){return po.call(this,t,"in",e)||this}function _o(t,e){return yo.call(this,t,"array-contains",e)||this}function So(t){return(t.before?"b":"a")+":"+t.position.map(Pi).join(",")}var Ao=function(t,e){void 0===e&&(e="asc"),this.field=t,this.dir=e};function Do(t,e,n){for(var r=0,i=0;i":"GREATER_THAN",">=":"GREATER_THAN_OR_EQUAL","==":"EQUAL","!=":"NOT_EQUAL","array-contains":"ARRAY_CONTAINS",in:"IN","not-in":"NOT_IN","array-contains-any":"ARRAY_CONTAINS_ANY"},ga=function(t,e){this.databaseId=t,this.I=e};function ma(t,e){return t.I?new Date(1e3*e.seconds).toISOString().replace(/\.\d*/,"").replace("Z","")+"."+("000000000"+e.nanoseconds).slice(-9)+"Z":{seconds:""+e.seconds,nanos:e.nanoseconds}}function va(t,e){return t.I?e.toBase64():e.toUint8Array()}function wa(t){return Wr(!!t),ei.fromTimestamp((t=bi(t),new ti(t.seconds,t.nanos)))}function ba(t,e){return new ci(["projects",t.projectId,"databases",t.database]).child("documents").child(e).canonicalString()}function Ea(t){t=ci.fromString(t);return Wr(Ba(t)),t}function Ta(t,e){return ba(t.databaseId,e.path)}function Ia(t,e){e=Ea(e);if(e.get(1)!==t.databaseId.projectId)throw new Ur(Vr.INVALID_ARGUMENT,"Tried to deserialize key from different project: "+e.get(1)+" vs "+t.databaseId.projectId);if(e.get(3)!==t.databaseId.database)throw new Ur(Vr.INVALID_ARGUMENT,"Tried to deserialize key from different database: "+e.get(3)+" vs "+t.databaseId.database);return new Ni(Da(e))}function _a(t,e){return ba(t.databaseId,e)}function Sa(t){t=Ea(t);return 4===t.length?ci.emptyPath():Da(t)}function Aa(t){return new ci(["projects",t.databaseId.projectId,"databases",t.databaseId.database]).canonicalString()}function Da(t){return Wr(4";case"GREATER_THAN_OR_EQUAL":return">=";case"LESS_THAN":return"<";case"LESS_THAN_OR_EQUAL":return"<=";case"ARRAY_CONTAINS":return"array-contains";case"IN":return"in";case"NOT_IN":return"not-in";case"ARRAY_CONTAINS_ANY":return"array-contains-any";case"OPERATOR_UNSPECIFIED":default:return zr()}}(),t.fieldFilter.value)}function qa(t){switch(t.unaryFilter.op){case"IS_NAN":var e=Va(t.unaryFilter.field);return Zi.create(e,"==",{doubleValue:NaN});case"IS_NULL":e=Va(t.unaryFilter.field);return Zi.create(e,"==",{nullValue:"NULL_VALUE"});case"IS_NOT_NAN":var n=Va(t.unaryFilter.field);return Zi.create(n,"!=",{doubleValue:NaN});case"IS_NOT_NULL":n=Va(t.unaryFilter.field);return Zi.create(n,"!=",{nullValue:"NULL_VALUE"});case"OPERATOR_UNSPECIFIED":default:return zr()}}function Ba(t){return 4<=t.length&&"projects"===t.get(0)&&"databases"===t.get(2)}function ja(t){for(var e="",n=0;n",t),this.store.put(t));return Au(t)},Su.prototype.add=function(t){return Kr("SimpleDb","ADD",this.store.name,t,t),Au(this.store.add(t))},Su.prototype.get=function(e){var n=this;return Au(this.store.get(e)).next(function(t){return Kr("SimpleDb","GET",n.store.name,e,t=void 0===t?null:t),t})},Su.prototype.delete=function(t){return Kr("SimpleDb","DELETE",this.store.name,t),Au(this.store.delete(t))},Su.prototype.count=function(){return Kr("SimpleDb","COUNT",this.store.name),Au(this.store.count())},Su.prototype.Nt=function(t,e){var e=this.cursor(this.options(t,e)),n=[];return this.xt(e,function(t,e){n.push(e)}).next(function(){return n})},Su.prototype.kt=function(t,e){Kr("SimpleDb","DELETE ALL",this.store.name);e=this.options(t,e);e.Ft=!1;e=this.cursor(e);return this.xt(e,function(t,e,n){return n.delete()})},Su.prototype.$t=function(t,e){e?n=t:(n={},e=t);var n=this.cursor(n);return this.xt(n,e)},Su.prototype.Ot=function(r){var t=this.cursor({});return new fu(function(n,e){t.onerror=function(t){t=Nu(t.target.error);e(t)},t.onsuccess=function(t){var e=t.target.result;e?r(e.primaryKey,e.value).next(function(t){t?e.continue():n()}):n()}})},Su.prototype.xt=function(t,i){var o=[];return new fu(function(r,e){t.onerror=function(t){e(t.target.error)},t.onsuccess=function(t){var e,n=t.target.result;n?(e=new yu(n),(t=i(n.primaryKey,n.value,e))instanceof fu&&(t=t.catch(function(t){return e.done(),fu.reject(t)}),o.push(t)),e.isDone?r():null===e.Dt?n.continue():n.continue(e.Dt)):r()}}).next(function(){return fu.waitFor(o)})},Su.prototype.options=function(t,e){var n;return void 0!==t&&("string"==typeof t?n=t:e=t),{index:n,range:e}},Su.prototype.cursor=function(t){var e="next";if(t.reverse&&(e="prev"),t.index){var n=this.store.index(t.index);return t.Ft?n.openKeyCursor(t.range,e):n.openCursor(t.range,e)}return this.store.openCursor(t.range,e)},Su);function Su(t){this.store=t}function Au(t){return new fu(function(e,n){t.onsuccess=function(t){t=t.target.result;e(t)},t.onerror=function(t){t=Nu(t.target.error);n(t)}})}var Du=!1;function Nu(t){var e=pu._t(h());if(12.2<=e&&e<13){e="An internal error was encountered in the Indexed Database server";if(0<=t.message.indexOf(e)){var n=new Ur("internal","IOS_INDEXEDDB_BUG1: IndexedDb has thrown '"+e+"'. This is likely due to an unavoidable bug in iOS. See https://stackoverflow.com/q/56496296/110915 for details and a potential workaround.");return Du||(Du=!0,setTimeout(function(){throw n},0)),n}}return t}var Cu,ku=(n(Ru,Cu=R),Ru);function Ru(t,e){var n=this;return(n=Cu.call(this)||this).Mt=t,n.currentSequenceNumber=e,n}function xu(t,e){return pu.It(t.Mt,e)}var Ou=(Uu.prototype.applyToRemoteDocument=function(t,e){for(var n,r,i,o,s,a,u=e.mutationResults,c=0;c=i),o=Hu(r.R,e)),n.done()}).next(function(){return o})},dc.prototype.getHighestUnacknowledgedBatchId=function(t){var e=IDBKeyRange.upperBound([this.userId,Number.POSITIVE_INFINITY]),r=-1;return yc(t).$t({index:Wa.userMutationsIndex,range:e,reverse:!0},function(t,e,n){r=e.batchId,n.done()}).next(function(){return r})},dc.prototype.getAllMutationBatches=function(t){var e=this,n=IDBKeyRange.bound([this.userId,-1],[this.userId,Number.POSITIVE_INFINITY]);return yc(t).Nt(Wa.userMutationsIndex,n).next(function(t){return t.map(function(t){return Hu(e.R,t)})})},dc.prototype.getAllMutationBatchesAffectingDocumentKey=function(o,s){var a=this,t=Ya.prefixForPath(this.userId,s.path),t=IDBKeyRange.lowerBound(t),u=[];return gc(o).$t({range:t},function(t,e,n){var r=t[0],i=t[1],t=t[2],i=Ga(i);if(r===a.userId&&s.path.isEqual(i))return yc(o).get(t).next(function(t){if(!t)throw zr();Wr(t.userId===a.userId),u.push(Hu(a.R,t))});n.done()}).next(function(){return u})},dc.prototype.getAllMutationBatchesAffectingDocumentKeys=function(e,t){var s=this,a=new Qs($r),n=[];return t.forEach(function(o){var t=Ya.prefixForPath(s.userId,o.path),t=IDBKeyRange.lowerBound(t),t=gc(e).$t({range:t},function(t,e,n){var r=t[0],i=t[1],t=t[2],i=Ga(i);r===s.userId&&o.path.isEqual(i)?a=a.add(t):n.done()});n.push(t)}),fu.waitFor(n).next(function(){return s.Wt(e,a)})},dc.prototype.getAllMutationBatchesAffectingQuery=function(t,e){var o=this,s=e.path,a=s.length+1,e=Ya.prefixForPath(this.userId,s),e=IDBKeyRange.lowerBound(e),u=new Qs($r);return gc(t).$t({range:e},function(t,e,n){var r=t[0],i=t[1],t=t[2],i=Ga(i);r===o.userId&&s.isPrefixOf(i)?i.length===a&&(u=u.add(t)):n.done()}).next(function(){return o.Wt(t,u)})},dc.prototype.Wt=function(e,t){var n=this,r=[],i=[];return t.forEach(function(t){i.push(yc(e).get(t).next(function(t){if(null===t)throw zr();Wr(t.userId===n.userId),r.push(Hu(n.R,t))}))}),fu.waitFor(i).next(function(){return r})},dc.prototype.removeMutationBatch=function(e,n){var r=this;return hc(e.Mt,this.userId,n).next(function(t){return e.addOnCommittedListener(function(){r.Gt(n.batchId)}),fu.forEach(t,function(t){return r.referenceDelegate.markPotentiallyOrphaned(e,t)})})},dc.prototype.Gt=function(t){delete this.Kt[t]},dc.prototype.performConsistencyCheck=function(e){var i=this;return this.checkEmpty(e).next(function(t){if(!t)return fu.resolve();var t=IDBKeyRange.lowerBound(Ya.prefixForUser(i.userId)),r=[];return gc(e).$t({range:t},function(t,e,n){t[0]===i.userId?(t=Ga(t[1]),r.push(t)):n.done()}).next(function(){Wr(0===r.length)})})},dc.prototype.containsKey=function(t,e){return pc(t,this.userId,e)},dc.prototype.zt=function(t){var e=this;return mc(t).get(this.userId).next(function(t){return t||new za(e.userId,-1,"")})},dc);function dc(t,e,n,r){this.userId=t,this.R=e,this.Ut=n,this.referenceDelegate=r,this.Kt={}}function pc(t,o,e){var e=Ya.prefixForPath(o,e.path),s=e[1],e=IDBKeyRange.lowerBound(e),a=!1;return gc(t).$t({range:e,Ft:!0},function(t,e,n){var r=t[0],i=t[1];t[2],r===o&&i===s&&(a=!0),n.done()}).next(function(){return a})}function yc(t){return xu(t,Wa.store)}function gc(t){return xu(t,Ya.store)}function mc(t){return xu(t,za.store)}var vc=(Ec.prototype.next=function(){return this.Ht+=2,this.Ht},Ec.Jt=function(){return new Ec(0)},Ec.Yt=function(){return new Ec(-1)},Ec),wc=(bc.prototype.allocateTargetId=function(n){var r=this;return this.Xt(n).next(function(t){var e=new vc(t.highestTargetId);return t.highestTargetId=e.next(),r.Zt(n,t).next(function(){return t.highestTargetId})})},bc.prototype.getLastRemoteSnapshotVersion=function(t){return this.Xt(t).next(function(t){return ei.fromTimestamp(new ti(t.lastRemoteSnapshotVersion.seconds,t.lastRemoteSnapshotVersion.nanoseconds))})},bc.prototype.getHighestSequenceNumber=function(t){return this.Xt(t).next(function(t){return t.highestListenSequenceNumber})},bc.prototype.setTargetsMetadata=function(e,n,r){var i=this;return this.Xt(e).next(function(t){return t.highestListenSequenceNumber=n,r&&(t.lastRemoteSnapshotVersion=r.toTimestamp()),n>t.highestListenSequenceNumber&&(t.highestListenSequenceNumber=n),i.Zt(e,t)})},bc.prototype.addTargetData=function(e,n){var r=this;return this.te(e,n).next(function(){return r.Xt(e).next(function(t){return t.targetCount+=1,r.ee(n,t),r.Zt(e,t)})})},bc.prototype.updateTargetData=function(t,e){return this.te(t,e)},bc.prototype.removeTargetData=function(e,t){var n=this;return this.removeMatchingKeysForTargetId(e,t.targetId).next(function(){return Tc(e).delete(t.targetId)}).next(function(){return n.Xt(e)}).next(function(t){return Wr(0e.highestTargetId&&(e.highestTargetId=t.targetId,n=!0),t.sequenceNumber>e.highestListenSequenceNumber&&(e.highestListenSequenceNumber=t.sequenceNumber,n=!0),n},bc.prototype.getTargetCount=function(t){return this.Xt(t).next(function(t){return t.targetCount})},bc.prototype.getTargetData=function(t,r){var e=Yi(r),e=IDBKeyRange.bound([e,Number.NEGATIVE_INFINITY],[e,Number.POSITIVE_INFINITY]),i=null;return Tc(t).$t({range:e,index:eu.queryTargetsIndexName},function(t,e,n){e=zu(e);Xi(r,e.target)&&(i=e,n.done())}).next(function(){return i})},bc.prototype.addMatchingKeys=function(n,t,r){var i=this,o=[],s=_c(n);return t.forEach(function(t){var e=ja(t.path);o.push(s.put(new nu(r,e))),o.push(i.referenceDelegate.addReference(n,r,t))}),fu.waitFor(o)},bc.prototype.removeMatchingKeys=function(n,t,r){var i=this,o=_c(n);return fu.forEach(t,function(t){var e=ja(t.path);return fu.waitFor([o.delete([r,e]),i.referenceDelegate.removeReference(n,r,t)])})},bc.prototype.removeMatchingKeysForTargetId=function(t,e){t=_c(t),e=IDBKeyRange.bound([e],[e+1],!1,!0);return t.delete(e)},bc.prototype.getMatchingKeysForTargetId=function(t,e){var e=IDBKeyRange.bound([e],[e+1],!1,!0),t=_c(t),r=Zs();return t.$t({range:e,Ft:!0},function(t,e,n){t=Ga(t[1]),t=new Ni(t);r=r.add(t)}).next(function(){return r})},bc.prototype.containsKey=function(t,e){var e=ja(e.path),e=IDBKeyRange.bound([e],[Zr(e)],!1,!0),i=0;return _c(t).$t({index:nu.documentTargetsIndex,Ft:!0,range:e},function(t,e,n){var r=t[0];t[1],0!==r&&(i++,n.done())}).next(function(){return 0h.params.maximumSequenceNumbersToCollect?(Kr("LruGarbageCollector","Capping sequence numbers to collect down to the maximum of "+h.params.maximumSequenceNumbersToCollect+" from "+t),h.params.maximumSequenceNumbersToCollect):t,s=Date.now(),h.nthSequenceNumber(e,i)}).next(function(t){return r=t,a=Date.now(),h.removeTargets(e,r,n)}).next(function(t){return o=t,u=Date.now(),h.removeOrphanedDocuments(e,r)}).next(function(t){return c=Date.now(),jr()<=w.DEBUG&&Kr("LruGarbageCollector","LRU Garbage Collection\n\tCounted targets in "+(s-l)+"ms\n\tDetermined least recently used "+i+" in "+(a-s)+"ms\n\tRemoved "+o+" targets in "+(u-a)+"ms\n\tRemoved "+t+" documents in "+(c-u)+"ms\nTotal Duration: "+(c-l)+"ms"),fu.resolve({didRun:!0,sequenceNumbersCollected:i,targetsRemoved:o,documentsRemoved:t})})},xc),kc=(Rc.prototype.he=function(t){var n=this.de(t);return this.db.getTargetCache().getTargetCount(t).next(function(e){return n.next(function(t){return e+t})})},Rc.prototype.de=function(t){var e=0;return this.le(t,function(t){e++}).next(function(){return e})},Rc.prototype.forEachTarget=function(t,e){return this.db.getTargetCache().forEachTarget(t,e)},Rc.prototype.le=function(t,n){return this.we(t,function(t,e){return n(e)})},Rc.prototype.addReference=function(t,e,n){return Pc(t,n)},Rc.prototype.removeReference=function(t,e,n){return Pc(t,n)},Rc.prototype.removeTargets=function(t,e,n){return this.db.getTargetCache().removeTargets(t,e,n)},Rc.prototype.markPotentiallyOrphaned=Pc,Rc.prototype._e=function(t,e){return r=e,i=!1,mc(n=t).Ot(function(t){return pc(n,t,r).next(function(t){return t&&(i=!0),fu.resolve(!t)})}).next(function(){return i});var n,r,i},Rc.prototype.removeOrphanedDocuments=function(n,r){var i=this,o=this.db.getRemoteDocumentCache().newChangeBuffer(),s=[],a=0;return this.we(n,function(e,t){t<=r&&(t=i._e(n,e).next(function(t){if(!t)return a++,o.getEntry(n,e).next(function(){return o.removeEntry(e),_c(n).delete([0,ja(e.path)])})}),s.push(t))}).next(function(){return fu.waitFor(s)}).next(function(){return o.apply(n)}).next(function(){return a})},Rc.prototype.removeTarget=function(t,e){e=e.withSequenceNumber(t.currentSequenceNumber);return this.db.getTargetCache().updateTargetData(t,e)},Rc.prototype.updateLimboDocument=Pc,Rc.prototype.we=function(t,r){var i,t=_c(t),o=Pr.o;return t.$t({index:nu.documentTargetsIndex},function(t,e){var n=t[0];t[1];t=e.path,e=e.sequenceNumber;0===n?(o!==Pr.o&&r(new Ni(Ga(i)),o),o=e,i=t):o=Pr.o}).next(function(){o!==Pr.o&&r(new Ni(Ga(i)),o)})},Rc.prototype.getCacheSize=function(t){return this.db.getRemoteDocumentCache().getSize(t)},Rc);function Rc(t,e){this.db=t,this.garbageCollector=new Cc(this,e)}function xc(t,e){this.ae=t,this.params=e}function Oc(t,e){this.garbageCollector=t,this.asyncQueue=e,this.oe=!1,this.ce=null}function Lc(t){this.ne=t,this.buffer=new Qs(Ac),this.se=0}function Pc(t,e){return _c(t).put((t=t.currentSequenceNumber,new nu(0,ja(e.path),t)))}var Mc,Fc=(Kc.prototype.get=function(t){var e=this.mapKeyFn(t),e=this.inner[e];if(void 0!==e)for(var n=0,r=e;n "+n),1))},Jc.prototype.We=function(){var t=this;null!==this.document&&"function"==typeof this.document.addEventListener&&(this.Fe=function(){t.Se.enqueueAndForget(function(){return t.inForeground="visible"===t.document.visibilityState,t.je()})},this.document.addEventListener("visibilitychange",this.Fe),this.inForeground="visible"===this.document.visibilityState)},Jc.prototype.an=function(){this.Fe&&(this.document.removeEventListener("visibilitychange",this.Fe),this.Fe=null)},Jc.prototype.Ge=function(){var t,e=this;"function"==typeof(null===(t=this.window)||void 0===t?void 0:t.addEventListener)&&(this.ke=function(){e.un(),c()&&navigator.appVersion.match("Version/14")&&e.Se.enterRestrictedMode(!0),e.Se.enqueueAndForget(function(){return e.shutdown()})},this.window.addEventListener("pagehide",this.ke))},Jc.prototype.hn=function(){this.ke&&(this.window.removeEventListener("pagehide",this.ke),this.ke=null)},Jc.prototype.cn=function(t){var e;try{var n=null!==(null===(e=this.Qe)||void 0===e?void 0:e.getItem(this.on(t)));return Kr("IndexedDbPersistence","Client '"+t+"' "+(n?"is":"is not")+" zombied in LocalStorage"),n}catch(t){return Gr("IndexedDbPersistence","Failed to get zombied client id.",t),!1}},Jc.prototype.un=function(){if(this.Qe)try{this.Qe.setItem(this.on(this.clientId),String(Date.now()))}catch(t){Gr("Failed to set zombie client id.",t)}},Jc.prototype.ln=function(){if(this.Qe)try{this.Qe.removeItem(this.on(this.clientId))}catch(t){}},Jc.prototype.on=function(t){return"firestore_zombie_"+this.persistenceKey+"_"+t},Jc);function Jc(t,e,n,r,i,o,s,a,u,c){if(this.allowTabSynchronization=t,this.persistenceKey=e,this.clientId=n,this.Se=i,this.window=o,this.document=s,this.De=u,this.Ce=c,this.Ne=null,this.xe=!1,this.isPrimary=!1,this.networkEnabled=!0,this.ke=null,this.inForeground=!1,this.Fe=null,this.$e=null,this.Oe=Number.NEGATIVE_INFINITY,this.Me=function(t){return Promise.resolve()},!Jc.yt())throw new Ur(Vr.UNIMPLEMENTED,"This platform is either missing IndexedDB or is known to have an incomplete implementation. Offline persistence has been disabled.");this.referenceDelegate=new kc(this,r),this.Le=e+"main",this.R=new Mu(a),this.Be=new pu(this.Le,11,new zc(this.R)),this.qe=new wc(this.referenceDelegate,this.R),this.Ut=new nc,this.Ue=(e=this.R,a=this.Ut,new Vc(e,a)),this.Ke=new Xu,this.window&&this.window.localStorage?this.Qe=this.window.localStorage:(this.Qe=null,!1===c&&Gr("IndexedDbPersistence","LocalStorage is unavailable. As a result, persistence may not work reliably. In particular enablePersistence() could fail immediately after refreshing the page."))}function Zc(t){return xu(t,Qa.store)}function th(t){return xu(t,ou.store)}function eh(t,e){var n=t.projectId;return t.isDefaultDatabase||(n+="."+t.database),"firestore/"+e+"/"+n+"/"}function nh(t,e){this.progress=t,this.wn=e}var rh=(hh.prototype.mn=function(e,n){var r=this;return this._n.getAllMutationBatchesAffectingDocumentKey(e,n).next(function(t){return r.yn(e,n,t)})},hh.prototype.yn=function(t,e,r){return this.Ue.getEntry(t,e).next(function(t){for(var e=0,n=r;ee?this._n[e]:null)},Kh.prototype.getHighestUnacknowledgedBatchId=function(){return fu.resolve(0===this._n.length?-1:this.ss-1)},Kh.prototype.getAllMutationBatches=function(t){return fu.resolve(this._n.slice())},Kh.prototype.getAllMutationBatchesAffectingDocumentKey=function(t,e){var n=this,r=new Dh(e,0),e=new Dh(e,Number.POSITIVE_INFINITY),i=[];return this.rs.forEachInRange([r,e],function(t){t=n.os(t.ns);i.push(t)}),fu.resolve(i)},Kh.prototype.getAllMutationBatchesAffectingDocumentKeys=function(t,e){var n=this,r=new Qs($r);return e.forEach(function(t){var e=new Dh(t,0),t=new Dh(t,Number.POSITIVE_INFINITY);n.rs.forEachInRange([e,t],function(t){r=r.add(t.ns)})}),fu.resolve(this.us(r))},Kh.prototype.getAllMutationBatchesAffectingQuery=function(t,e){var n=e.path,r=n.length+1,e=n;Ni.isDocumentKey(e)||(e=e.child(""));var e=new Dh(new Ni(e),0),i=new Qs($r);return this.rs.forEachWhile(function(t){var e=t.key.path;return!!n.isPrefixOf(e)&&(e.length===r&&(i=i.add(t.ns)),!0)},e),fu.resolve(this.us(i))},Kh.prototype.us=function(t){var e=this,n=[];return t.forEach(function(t){t=e.os(t);null!==t&&n.push(t)}),n},Kh.prototype.removeMutationBatch=function(n,r){var i=this;Wr(0===this.hs(r.batchId,"removed")),this._n.shift();var o=this.rs;return fu.forEach(r.mutations,function(t){var e=new Dh(t.key,r.batchId);return o=o.delete(e),i.referenceDelegate.markPotentiallyOrphaned(n,t.key)}).next(function(){i.rs=o})},Kh.prototype.Gt=function(t){},Kh.prototype.containsKey=function(t,e){var n=new Dh(e,0),n=this.rs.firstAfterOrEqual(n);return fu.resolve(e.isEqual(n&&n.key))},Kh.prototype.performConsistencyCheck=function(t){return this._n.length,fu.resolve()},Kh.prototype.hs=function(t,e){return this.cs(t)},Kh.prototype.cs=function(t){return 0===this._n.length?0:t-this._n[0].batchId},Kh.prototype.os=function(t){t=this.cs(t);return t<0||t>=this._n.length?null:this._n[t]},Kh),Ch=(jh.prototype.addEntry=function(t,e,n){var r=e.key,i=this.docs.get(r),o=i?i.size:0,i=this.ls(e);return this.docs=this.docs.insert(r,{document:e.clone(),size:i,readTime:n}),this.size+=i-o,this.Ut.addToCollectionParentIndex(t,r.path.popLast())},jh.prototype.removeEntry=function(t){var e=this.docs.get(t);e&&(this.docs=this.docs.remove(t),this.size-=e.size)},jh.prototype.getEntry=function(t,e){var n=this.docs.get(e);return fu.resolve(n?n.document.clone():Qi.newInvalidDocument(e))},jh.prototype.getEntries=function(t,e){var n=this,r=zs;return e.forEach(function(t){var e=n.docs.get(t);r=r.insert(t,e?e.document.clone():Qi.newInvalidDocument(t))}),fu.resolve(r)},jh.prototype.getDocumentsMatchingQuery=function(t,e,n){for(var r=zs,i=new Ni(e.path.child("")),o=this.docs.getIteratorFrom(i);o.hasNext();){var s=o.getNext(),a=s.key,u=s.value,s=u.document,u=u.readTime;if(!e.path.isPrefixOf(a.path))break;u.compareTo(n)<=0||Ko(e,s)&&(r=r.insert(s.key,s.clone()))}return fu.resolve(r)},jh.prototype.fs=function(t,e){return fu.forEach(this.docs,function(t){return e(t)})},jh.prototype.newChangeBuffer=function(t){return new kh(this)},jh.prototype.getSize=function(t){return fu.resolve(this.size)},jh),kh=(n(Bh,_h=A),Bh.prototype.applyChanges=function(n){var r=this,i=[];return this.changes.forEach(function(t,e){e.document.isValidDocument()?i.push(r.Ie.addEntry(n,e.document,r.getReadTime(t))):r.Ie.removeEntry(t)}),fu.waitFor(i)},Bh.prototype.getFromCache=function(t,e){return this.Ie.getEntry(t,e)},Bh.prototype.getAllFromCache=function(t,e){return this.Ie.getEntries(t,e)},Bh),Rh=(qh.prototype.forEachTarget=function(t,n){return this.ds.forEach(function(t,e){return n(e)}),fu.resolve()},qh.prototype.getLastRemoteSnapshotVersion=function(t){return fu.resolve(this.lastRemoteSnapshotVersion)},qh.prototype.getHighestSequenceNumber=function(t){return fu.resolve(this.ws)},qh.prototype.allocateTargetId=function(t){return this.highestTargetId=this.ys.next(),fu.resolve(this.highestTargetId)},qh.prototype.setTargetsMetadata=function(t,e,n){return n&&(this.lastRemoteSnapshotVersion=n),e>this.ws&&(this.ws=e),fu.resolve()},qh.prototype.te=function(t){this.ds.set(t.target,t);var e=t.targetId;e>this.highestTargetId&&(this.ys=new vc(e),this.highestTargetId=e),t.sequenceNumber>this.ws&&(this.ws=t.sequenceNumber)},qh.prototype.addTargetData=function(t,e){return this.te(e),this.targetCount+=1,fu.resolve()},qh.prototype.updateTargetData=function(t,e){return this.te(e),fu.resolve()},qh.prototype.removeTargetData=function(t,e){return this.ds.delete(e.target),this._s.Zn(e.targetId),--this.targetCount,fu.resolve()},qh.prototype.removeTargets=function(n,r,i){var o=this,s=0,a=[];return this.ds.forEach(function(t,e){e.sequenceNumber<=r&&null===i.get(e.targetId)&&(o.ds.delete(t),a.push(o.removeMatchingKeysForTargetId(n,e.targetId)),s++)}),fu.waitFor(a).next(function(){return s})},qh.prototype.getTargetCount=function(t){return fu.resolve(this.targetCount)},qh.prototype.getTargetData=function(t,e){e=this.ds.get(e)||null;return fu.resolve(e)},qh.prototype.addMatchingKeys=function(t,e,n){return this._s.Jn(e,n),fu.resolve()},qh.prototype.removeMatchingKeys=function(e,t,n){this._s.Xn(t,n);var r=this.persistence.referenceDelegate,i=[];return r&&t.forEach(function(t){i.push(r.markPotentiallyOrphaned(e,t))}),fu.waitFor(i)},qh.prototype.removeMatchingKeysForTargetId=function(t,e){return this._s.Zn(e),fu.resolve()},qh.prototype.getMatchingKeysForTargetId=function(t,e){e=this._s.es(e);return fu.resolve(e)},qh.prototype.containsKey=function(t,e){return fu.resolve(this._s.containsKey(e))},qh),xh=(Uh.prototype.start=function(){return Promise.resolve()},Uh.prototype.shutdown=function(){return this.xe=!1,Promise.resolve()},Object.defineProperty(Uh.prototype,"started",{get:function(){return this.xe},enumerable:!1,configurable:!0}),Uh.prototype.setDatabaseDeletedListener=function(){},Uh.prototype.setNetworkEnabled=function(){},Uh.prototype.getIndexManager=function(){return this.Ut},Uh.prototype.getMutationQueue=function(t){var e=this.gs[t.toKey()];return e||(e=new Nh(this.Ut,this.referenceDelegate),this.gs[t.toKey()]=e),e},Uh.prototype.getTargetCache=function(){return this.qe},Uh.prototype.getRemoteDocumentCache=function(){return this.Ue},Uh.prototype.getBundleCache=function(){return this.Ke},Uh.prototype.runTransaction=function(t,e,n){var r=this;Kr("MemoryPersistence","Starting transaction:",t);var i=new Oh(this.Ne.next());return this.referenceDelegate.Es(),n(i).next(function(t){return r.referenceDelegate.Ts(i).next(function(){return t})}).toPromise().then(function(t){return i.raiseOnCommittedEvent(),t})},Uh.prototype.Is=function(e,n){return fu.or(Object.values(this.gs).map(function(t){return function(){return t.containsKey(e,n)}}))},Uh),Oh=(n(Vh,Ih=R),Vh),Lh=(Fh.bs=function(t){return new Fh(t)},Object.defineProperty(Fh.prototype,"vs",{get:function(){if(this.Rs)return this.Rs;throw zr()},enumerable:!1,configurable:!0}),Fh.prototype.addReference=function(t,e,n){return this.As.addReference(n,e),this.vs.delete(n.toString()),fu.resolve()},Fh.prototype.removeReference=function(t,e,n){return this.As.removeReference(n,e),this.vs.add(n.toString()),fu.resolve()},Fh.prototype.markPotentiallyOrphaned=function(t,e){return this.vs.add(e.toString()),fu.resolve()},Fh.prototype.removeTarget=function(t,e){var n=this;this.As.Zn(e.targetId).forEach(function(t){return n.vs.add(t.toString())});var r=this.persistence.getTargetCache();return r.getMatchingKeysForTargetId(t,e.targetId).next(function(t){t.forEach(function(t){return n.vs.add(t.toString())})}).next(function(){return r.removeTargetData(t,e)})},Fh.prototype.Es=function(){this.Rs=new Set},Fh.prototype.Ts=function(n){var r=this,i=this.persistence.getRemoteDocumentCache().newChangeBuffer();return fu.forEach(this.vs,function(t){var e=Ni.fromPath(t);return r.Ps(n,e).next(function(t){t||i.removeEntry(e)})}).next(function(){return r.Rs=null,i.apply(n)})},Fh.prototype.updateLimboDocument=function(t,e){var n=this;return this.Ps(t,e).next(function(t){t?n.vs.delete(e.toString()):n.vs.add(e.toString())})},Fh.prototype.ps=function(t){return 0},Fh.prototype.Ps=function(t,e){var n=this;return fu.or([function(){return fu.resolve(n.As.containsKey(e))},function(){return n.persistence.getTargetCache().containsKey(t,e)},function(){return n.persistence.Is(t,e)}])},Fh),Ph=(Mh.prototype.isAuthenticated=function(){return null!=this.uid},Mh.prototype.toKey=function(){return this.isAuthenticated()?"uid:"+this.uid:"anonymous-user"},Mh.prototype.isEqual=function(t){return t.uid===this.uid},Mh);function Mh(t){this.uid=t}function Fh(t){this.persistence=t,this.As=new Ah,this.Rs=null}function Vh(t){var e=this;return(e=Ih.call(this)||this).currentSequenceNumber=t,e}function Uh(t,e){var n=this;this.gs={},this.Ne=new Pr(0),this.xe=!1,this.xe=!0,this.referenceDelegate=t(this),this.qe=new Rh(this),this.Ut=new tc,this.Ue=(t=this.Ut,new Ch(t,function(t){return n.referenceDelegate.ps(t)})),this.R=new Mu(e),this.Ke=new Sh(this.R)}function qh(t){this.persistence=t,this.ds=new Fc(Yi,Xi),this.lastRemoteSnapshotVersion=ei.min(),this.highestTargetId=0,this.ws=0,this._s=new Ah,this.targetCount=0,this.ys=vc.Jt()}function Bh(t){var e=this;return(e=_h.call(this)||this).Ie=t,e}function jh(t,e){this.Ut=t,this.ls=e,this.docs=new Vs(Ni.comparator),this.size=0}function Kh(t,e){this.Ut=t,this.referenceDelegate=e,this._n=[],this.ss=1,this.rs=new Qs(Dh.Gn)}function Gh(t,e){this.key=t,this.ns=e}function Qh(){this.Wn=new Qs(Dh.Gn),this.zn=new Qs(Dh.Hn)}function Hh(t){this.R=t,this.Qn=new Map,this.jn=new Map}function zh(t,e){return"firestore_clients_"+t+"_"+e}function Wh(t,e,n){n="firestore_mutations_"+t+"_"+n;return e.isAuthenticated()&&(n+="_"+e.uid),n}function Yh(t,e){return"firestore_targets_"+t+"_"+e}Ph.UNAUTHENTICATED=new Ph(null),Ph.GOOGLE_CREDENTIALS=new Ph("google-credentials-uid"),Ph.FIRST_PARTY=new Ph("first-party-uid"),Ph.MOCK_USER=new Ph("mock-user");var Xh,$h=(bl.Vs=function(t,e,n){var r,i=JSON.parse(n),o="object"==typeof i&&-1!==["pending","acknowledged","rejected"].indexOf(i.state)&&(void 0===i.error||"object"==typeof i.error);return o&&i.error&&(o="string"==typeof i.error.message&&"string"==typeof i.error.code)&&(r=new Ur(i.error.code,i.error.message)),o?new bl(t,e,i.state,r):(Gr("SharedClientState","Failed to parse mutation state for ID '"+e+"': "+n),null)},bl.prototype.Ss=function(){var t={state:this.state,updateTimeMs:Date.now()};return this.error&&(t.error={code:this.error.code,message:this.error.message}),JSON.stringify(t)},bl),Jh=(wl.Vs=function(t,e){var n,r=JSON.parse(e),i="object"==typeof r&&-1!==["not-current","current","rejected"].indexOf(r.state)&&(void 0===r.error||"object"==typeof r.error);return i&&r.error&&(i="string"==typeof r.error.message&&"string"==typeof r.error.code)&&(n=new Ur(r.error.code,r.error.message)),i?new wl(t,r.state,n):(Gr("SharedClientState","Failed to parse target state for ID '"+t+"': "+e),null)},wl.prototype.Ss=function(){var t={state:this.state,updateTimeMs:Date.now()};return this.error&&(t.error={code:this.error.code,message:this.error.message}),JSON.stringify(t)},wl),Zh=(vl.Vs=function(t,e){for(var n=JSON.parse(e),r="object"==typeof n&&n.activeTargetIds instanceof Array,i=ta,o=0;r&&othis.Bi&&(this.qi=this.Bi)},Vl.prototype.Gi=function(){null!==this.Ui&&(this.Ui.skipDelay(),this.Ui=null)},Vl.prototype.cancel=function(){null!==this.Ui&&(this.Ui.cancel(),this.Ui=null)},Vl.prototype.Wi=function(){return(Math.random()-.5)*this.qi},Vl),A=(Fl.prototype.tr=function(){return 1===this.state||2===this.state||4===this.state},Fl.prototype.er=function(){return 2===this.state},Fl.prototype.start=function(){3!==this.state?this.auth():this.nr()},Fl.prototype.stop=function(){return y(this,void 0,void 0,function(){return g(this,function(t){switch(t.label){case 0:return this.tr()?[4,this.close(0)]:[3,2];case 1:t.sent(),t.label=2;case 2:return[2]}})})},Fl.prototype.sr=function(){this.state=0,this.Zi.reset()},Fl.prototype.ir=function(){var t=this;this.er()&&null===this.Xi&&(this.Xi=this.Se.enqueueAfterDelay(this.zi,6e4,function(){return t.rr()}))},Fl.prototype.cr=function(t){this.ur(),this.stream.send(t)},Fl.prototype.rr=function(){return y(this,void 0,void 0,function(){return g(this,function(t){return this.er()?[2,this.close(0)]:[2]})})},Fl.prototype.ur=function(){this.Xi&&(this.Xi.cancel(),this.Xi=null)},Fl.prototype.close=function(e,n){return y(this,void 0,void 0,function(){return g(this,function(t){switch(t.label){case 0:return this.ur(),this.Zi.cancel(),this.Yi++,3!==e?this.Zi.reset():n&&n.code===Vr.RESOURCE_EXHAUSTED?(Gr(n.toString()),Gr("Using maximum backoff delay to prevent overloading the backend."),this.Zi.Qi()):n&&n.code===Vr.UNAUTHENTICATED&&this.Ji.invalidateToken(),null!==this.stream&&(this.ar(),this.stream.close(),this.stream=null),this.state=e,[4,this.listener.Ri(n)];case 1:return t.sent(),[2]}})})},Fl.prototype.ar=function(){},Fl.prototype.auth=function(){var n=this;this.state=1;var t=this.hr(this.Yi),e=this.Yi;this.Ji.getToken().then(function(t){n.Yi===e&&n.lr(t)},function(e){t(function(){var t=new Ur(Vr.UNKNOWN,"Fetching auth token failed: "+e.message);return n.dr(t)})})},Fl.prototype.lr=function(t){var e=this,n=this.hr(this.Yi);this.stream=this.wr(t),this.stream.Ii(function(){n(function(){return e.state=2,e.listener.Ii()})}),this.stream.Ri(function(t){n(function(){return e.dr(t)})}),this.stream.onMessage(function(t){n(function(){return e.onMessage(t)})})},Fl.prototype.nr=function(){var t=this;this.state=4,this.Zi.ji(function(){return y(t,void 0,void 0,function(){return g(this,function(t){return this.state=0,this.start(),[2]})})})},Fl.prototype.dr=function(t){return Kr("PersistentStream","close with error: "+t),this.stream=null,this.close(3,t)},Fl.prototype.hr=function(e){var n=this;return function(t){n.Se.enqueueAndForget(function(){return n.Yi===e?t():(Kr("PersistentStream","stream callback skipped by getCloseGuardedDispatcher."),Promise.resolve())})}},Fl),Cl=(n(Ml,Dl=A),Ml.prototype.wr=function(t){return this.Hi.Oi("Listen",t)},Ml.prototype.onMessage=function(t){this.Zi.reset();var e=function(t,e){if("targetChange"in e){e.targetChange;var n="NO_CHANGE"===(o=e.targetChange.targetChangeType||"NO_CHANGE")?0:"ADD"===o?1:"REMOVE"===o?2:"CURRENT"===o?3:"RESET"===o?4:zr(),r=e.targetChange.targetIds||[],i=(s=e.targetChange.resumeToken,t.I?(Wr(void 0===s||"string"==typeof s),di.fromBase64String(s||"")):(Wr(void 0===s||s instanceof Uint8Array),di.fromUint8Array(s||new Uint8Array))),o=(a=e.targetChange.cause)&&(u=void 0===(c=a).code?Vr.UNKNOWN:Fs(c.code),new Ur(u,c.message||"")),s=new oa(n,r,i,o||null)}else if("documentChange"in e){e.documentChange,(n=e.documentChange).document,n.document.name,n.document.updateTime;var r=Ia(t,n.document.name),i=wa(n.document.updateTime),a=new Ki({mapValue:{fields:n.document.fields}}),u=(o=Qi.newFoundDocument(r,i,a),n.targetIds||[]),c=n.removedTargetIds||[];s=new ra(u,c,o.key,o)}else if("documentDelete"in e)e.documentDelete,(n=e.documentDelete).document,r=Ia(t,n.document),i=n.readTime?wa(n.readTime):ei.min(),a=Qi.newNoDocument(r,i),o=n.removedTargetIds||[],s=new ra([],o,a.key,a);else if("documentRemove"in e)e.documentRemove,(n=e.documentRemove).document,r=Ia(t,n.document),i=n.removedTargetIds||[],s=new ra([],i,r,null);else{if(!("filter"in e))return zr();e.filter;e=e.filter;e.targetId,n=e.count||0,r=new Ns(n),i=e.targetId,s=new ia(i,r)}return s}(this.R,t),t=function(t){if(!("targetChange"in t))return ei.min();t=t.targetChange;return(!t.targetIds||!t.targetIds.length)&&t.readTime?wa(t.readTime):ei.min()}(t);return this.listener._r(e,t)},Ml.prototype.mr=function(t){var e,n,r,i={};i.database=Aa(this.R),i.addTarget=(e=this.R,(r=$i(r=(n=t).target)?{documents:xa(e,r)}:{query:Oa(e,r)}).targetId=n.targetId,0this.query.limit;){var n=xo(this.query)?h.last():h.first(),h=h.delete(n.key),c=c.delete(n.key);a.track({type:1,doc:n})}return{fo:h,mo:a,Nn:l,mutatedKeys:c}},Pf.prototype.yo=function(t,e){return t.hasLocalMutations&&e.hasCommittedMutations&&!e.hasLocalMutations},Pf.prototype.applyChanges=function(t,e,n){var o=this,r=this.fo;this.fo=t.fo,this.mutatedKeys=t.mutatedKeys;var i=t.mo.jr();i.sort(function(t,e){return r=t.type,i=e.type,n(r)-n(i)||o.lo(t.doc,e.doc);function n(t){switch(t){case 0:return 1;case 2:case 3:return 2;case 1:return 0;default:return zr()}}var r,i}),this.po(n);var s=e?this.Eo():[],n=0===this.ho.size&&this.current?1:0,e=n!==this.ao;return this.ao=n,0!==i.length||e?{snapshot:new lf(this.query,t.fo,r,i,t.mutatedKeys,0==n,e,!1),To:s}:{To:s}},Pf.prototype.zr=function(t){return this.current&&"Offline"===t?(this.current=!1,this.applyChanges({fo:this.fo,mo:new hf,mutatedKeys:this.mutatedKeys,Nn:!1},!1)):{To:[]}},Pf.prototype.Io=function(t){return!this.uo.has(t)&&!!this.fo.has(t)&&!this.fo.get(t).hasLocalMutations},Pf.prototype.po=function(t){var e=this;t&&(t.addedDocuments.forEach(function(t){return e.uo=e.uo.add(t)}),t.modifiedDocuments.forEach(function(t){}),t.removedDocuments.forEach(function(t){return e.uo=e.uo.delete(t)}),this.current=t.current)},Pf.prototype.Eo=function(){var e=this;if(!this.current)return[];var n=this.ho;this.ho=Zs(),this.fo.forEach(function(t){e.Io(t.key)&&(e.ho=e.ho.add(t.key))});var r=[];return n.forEach(function(t){e.ho.has(t)||r.push(new Cf(t))}),this.ho.forEach(function(t){n.has(t)||r.push(new Nf(t))}),r},Pf.prototype.Ao=function(t){this.uo=t.Bn,this.ho=Zs();t=this._o(t.documents);return this.applyChanges(t,!0)},Pf.prototype.Ro=function(){return lf.fromInitialDocuments(this.query,this.fo,this.mutatedKeys,0===this.ao)},Pf),Rf=function(t,e,n){this.query=t,this.targetId=e,this.view=n},xf=function(t){this.key=t,this.bo=!1},Of=(Object.defineProperty(Lf.prototype,"isPrimaryClient",{get:function(){return!0===this.$o},enumerable:!1,configurable:!0}),Lf);function Lf(t,e,n,r,i,o){this.localStore=t,this.remoteStore=e,this.eventManager=n,this.sharedClientState=r,this.currentUser=i,this.maxConcurrentLimboResolutions=o,this.vo={},this.Po=new Fc(Bo,qo),this.Vo=new Map,this.So=new Set,this.Do=new Vs(Ni.comparator),this.Co=new Map,this.No=new Ah,this.xo={},this.ko=new Map,this.Fo=vc.Yt(),this.onlineState="Unknown",this.$o=void 0}function Pf(t,e){this.query=t,this.uo=e,this.ao=null,this.current=!1,this.ho=Zs(),this.mutatedKeys=Zs(),this.lo=Go(t),this.fo=new cf(this.lo)}function Mf(i,o,s,a){return y(this,void 0,void 0,function(){var e,n,r;return g(this,function(t){switch(t.label){case 0:return i.Oo=function(t,e,n){return function(r,i,o,s){return y(this,void 0,void 0,function(){var e,n;return g(this,function(t){switch(t.label){case 0:return(e=i.view._o(o)).Nn?[4,wh(r.localStore,i.query,!1).then(function(t){t=t.documents;return i.view._o(t,e)})]:[3,2];case 1:e=t.sent(),t.label=2;case 2:return n=s&&s.targetChanges.get(i.targetId),n=i.view.applyChanges(e,r.isPrimaryClient,n),[2,(Hf(r,i.targetId,n.To),n.snapshot)]}})})}(i,t,e,n)},[4,wh(i.localStore,o,!0)];case 1:return n=t.sent(),r=new kf(o,n.Bn),e=r._o(n.documents),n=na.createSynthesizedTargetChangeForCurrentChange(s,a&&"Offline"!==i.onlineState),n=r.applyChanges(e,i.isPrimaryClient,n),Hf(i,s,n.To),r=new Rf(o,s,r),[2,(i.Po.set(o,r),i.Vo.has(s)?i.Vo.get(s).push(o):i.Vo.set(s,[o]),n.snapshot)]}})})}function Ff(f,d,p){return y(this,void 0,void 0,function(){var s,l;return g(this,function(t){switch(t.label){case 0:l=ed(f),t.label=1;case 1:return t.trys.push([1,5,,6]),[4,(i=l.localStore,a=d,c=i,h=ti.now(),o=a.reduce(function(t,e){return t.add(e.key)},Zs()),c.persistence.runTransaction("Locally write mutations","readwrite",function(s){return c.Mn.pn(s,o).next(function(t){u=t;for(var e=[],n=0,r=a;n, or >=) must be on the same field. But you have inequality filters on '"+n.toString()+"' and '"+e.field.toString()+"'");n=Lo(t);null!==n&&ag(0,e.field,n)}t=function(t,e){for(var n=0,r=t.filters;ns.length)throw new Ur(Vr.INVALID_ARGUMENT,"Too many arguments provided to "+r+"(). The number of arguments must be less than or equal to the number of orderBy() clauses");for(var a=[],u=0;u, or >=) on field '"+e.toString()+"' and so you must also use '"+e.toString()+"' as your first argument to orderBy(), but your first orderBy() is on field '"+n.toString()+"' instead.")}ug.prototype.convertValue=function(t,e){switch(void 0===e&&(e="none"),ki(t)){case 0:return null;case 1:return t.booleanValue;case 2:return Ei(t.integerValue||t.doubleValue);case 3:return this.convertTimestamp(t.timestampValue);case 4:return this.convertServerTimestamp(t,e);case 5:return t.stringValue;case 6:return this.convertBytes(Ti(t.bytesValue));case 7:return this.convertReference(t.referenceValue);case 8:return this.convertGeoPoint(t.geoPointValue);case 9:return this.convertArray(t.arrayValue,e);case 10:return this.convertObject(t.mapValue,e);default:throw zr()}},ug.prototype.convertObject=function(t,n){var r=this,i={};return oi(t.fields,function(t,e){i[t]=r.convertValue(e,n)}),i},ug.prototype.convertGeoPoint=function(t){return new Lp(Ei(t.latitude),Ei(t.longitude))},ug.prototype.convertArray=function(t,e){var n=this;return(t.values||[]).map(function(t){return n.convertValue(t,e)})},ug.prototype.convertServerTimestamp=function(t,e){switch(e){case"previous":var n=function t(e){e=e.mapValue.fields.__previous_value__;return Ii(e)?t(e):e}(t);return null==n?null:this.convertValue(n,e);case"estimate":return this.convertTimestamp(_i(t));default:return null}},ug.prototype.convertTimestamp=function(t){t=bi(t);return new ti(t.seconds,t.nanos)},ug.prototype.convertDocumentKey=function(t,e){var n=ci.fromString(t);Wr(Ba(n));t=new Fd(n.get(1),n.get(3)),n=new Ni(n.popFirst(5));return t.isEqual(e)||Gr("Document "+n+" contains a document reference within a different database ("+t.projectId+"/"+t.database+") which is not supported. It will be treated as a reference in the current database ("+e.projectId+"/"+e.database+") instead."),n},A=ug;function ug(){}function cg(t,e,n){return t?n&&(n.merge||n.mergeFields)?t.toFirestore(e,n):t.toFirestore(e):e}var hg,lg=(n(pg,hg=A),pg.prototype.convertBytes=function(t){return new xp(t)},pg.prototype.convertReference=function(t){t=this.convertDocumentKey(t,this.firestore._databaseId);return new ap(this.firestore,null,t)},pg),fg=(dg.prototype.set=function(t,e,n){this._verifyNotCommitted();t=yg(t,this._firestore),e=cg(t.converter,e,n),n=Yp(this._dataReader,"WriteBatch.set",t._key,e,null!==t.converter,n);return this._mutations.push(n.toMutation(t._key,ds.none())),this},dg.prototype.update=function(t,e,n){for(var r=[],i=3;i Date: Tue, 3 May 2022 21:48:09 +0200 Subject: [PATCH 09/10] fix: physics are FPS depended (#316) * fix: physics are FPS depended * fix: physics are FPS depended --- lib/game/pinball_game.dart | 3 +- .../lib/src/components/ball/ball.dart | 3 +- .../lib/src/components/initial_position.dart | 2 +- .../lib/src/components/layer.dart | 2 +- packages/pinball_flame/lib/pinball_flame.dart | 1 + .../lib/src/pinball_forge2d_game.dart | 44 ++++++++++++++++ .../test/src/pinball_forge2d_game_test.dart | 51 +++++++++++++++++++ .../game/components/controlled_ball_test.dart | 3 +- 8 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 packages/pinball_flame/lib/src/pinball_forge2d_game.dart create mode 100644 packages/pinball_flame/test/src/pinball_forge2d_game_test.dart diff --git a/lib/game/pinball_game.dart b/lib/game/pinball_game.dart index f9018ee5..bd29e4e8 100644 --- a/lib/game/pinball_game.dart +++ b/lib/game/pinball_game.dart @@ -5,7 +5,6 @@ import 'package:flame/components.dart'; import 'package:flame/game.dart'; import 'package:flame/input.dart'; import 'package:flame_bloc/flame_bloc.dart'; -import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:pinball/game/game.dart'; @@ -14,7 +13,7 @@ import 'package:pinball_components/pinball_components.dart'; import 'package:pinball_flame/pinball_flame.dart'; import 'package:pinball_theme/pinball_theme.dart'; -class PinballGame extends Forge2DGame +class PinballGame extends PinballForge2DGame with FlameBloc, HasKeyboardHandlerComponents, diff --git a/packages/pinball_components/lib/src/components/ball/ball.dart b/packages/pinball_components/lib/src/components/ball/ball.dart index dea4c0b4..12b1c877 100644 --- a/packages/pinball_components/lib/src/components/ball/ball.dart +++ b/packages/pinball_components/lib/src/components/ball/ball.dart @@ -12,8 +12,7 @@ import 'package:pinball_flame/pinball_flame.dart'; /// {@template ball} /// A solid, [BodyType.dynamic] sphere that rolls and bounces around. /// {@endtemplate} -class Ball extends BodyComponent - with Layered, InitialPosition, ZIndex { +class Ball extends BodyComponent with Layered, InitialPosition, ZIndex { /// {@macro ball} Ball({ required this.baseColor, diff --git a/packages/pinball_components/lib/src/components/initial_position.dart b/packages/pinball_components/lib/src/components/initial_position.dart index d79f8d64..4265a3a7 100644 --- a/packages/pinball_components/lib/src/components/initial_position.dart +++ b/packages/pinball_components/lib/src/components/initial_position.dart @@ -5,7 +5,7 @@ import 'package:flame_forge2d/flame_forge2d.dart'; /// /// Note: If the [initialPosition] is set after the [BodyComponent] has been /// loaded it will have no effect; defaulting to [Vector2.zero]. -mixin InitialPosition on BodyComponent { +mixin InitialPosition on BodyComponent { final Vector2 _initialPosition = Vector2.zero(); set initialPosition(Vector2 value) { diff --git a/packages/pinball_components/lib/src/components/layer.dart b/packages/pinball_components/lib/src/components/layer.dart index a39ad837..8418fac1 100644 --- a/packages/pinball_components/lib/src/components/layer.dart +++ b/packages/pinball_components/lib/src/components/layer.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; /// ignoring others. This compatibility depends on bit masking operation /// between layers. For more information read: https://en.wikipedia.org/wiki/Mask_(computing). /// {@endtemplate} -mixin Layered on BodyComponent { +mixin Layered on BodyComponent { Layer _layer = Layer.all; /// {@macro layered} diff --git a/packages/pinball_flame/lib/pinball_flame.dart b/packages/pinball_flame/lib/pinball_flame.dart index 66d34b14..8d458574 100644 --- a/packages/pinball_flame/lib/pinball_flame.dart +++ b/packages/pinball_flame/lib/pinball_flame.dart @@ -4,5 +4,6 @@ export 'src/component_controller.dart'; export 'src/contact_behavior.dart'; export 'src/keyboard_input_controller.dart'; export 'src/parent_is_a.dart'; +export 'src/pinball_forge2d_game.dart'; export 'src/sprite_animation.dart'; export 'src/z_canvas_component.dart'; diff --git a/packages/pinball_flame/lib/src/pinball_forge2d_game.dart b/packages/pinball_flame/lib/src/pinball_forge2d_game.dart new file mode 100644 index 00000000..118baad9 --- /dev/null +++ b/packages/pinball_flame/lib/src/pinball_forge2d_game.dart @@ -0,0 +1,44 @@ +import 'dart:math'; + +import 'package:flame/game.dart'; +import 'package:flame_forge2d/flame_forge2d.dart'; +import 'package:flame_forge2d/world_contact_listener.dart'; + +// NOTE(wolfen): This should be removed when https://github.com/flame-engine/flame/pull/1597 is solved. +/// {@template pinball_forge2d_game} +/// A [Game] that uses the Forge2D physics engine. +/// {@endtemplate} +class PinballForge2DGame extends FlameGame implements Forge2DGame { + /// {@macro pinball_forge2d_game} + PinballForge2DGame({ + required Vector2 gravity, + }) : world = World(gravity), + super(camera: Camera()) { + camera.zoom = Forge2DGame.defaultZoom; + world.setContactListener(WorldContactListener()); + } + + @override + final World world; + + @override + void update(double dt) { + super.update(dt); + world.stepDt(min(dt, 1 / 60)); + } + + @override + Vector2 screenToFlameWorld(Vector2 position) { + throw UnimplementedError(); + } + + @override + Vector2 screenToWorld(Vector2 position) { + throw UnimplementedError(); + } + + @override + Vector2 worldToScreen(Vector2 position) { + throw UnimplementedError(); + } +} diff --git a/packages/pinball_flame/test/src/pinball_forge2d_game_test.dart b/packages/pinball_flame/test/src/pinball_forge2d_game_test.dart new file mode 100644 index 00000000..872f8b97 --- /dev/null +++ b/packages/pinball_flame/test/src/pinball_forge2d_game_test.dart @@ -0,0 +1,51 @@ +// ignore_for_file: cascade_invocations + +import 'package:flame/extensions.dart'; +import 'package:flame_test/flame_test.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball_flame/pinball_flame.dart'; + +void main() { + final flameTester = FlameTester( + () => PinballForge2DGame(gravity: Vector2.zero()), + ); + + group('PinballForge2DGame', () { + test('can instantiate', () { + expect( + () => PinballForge2DGame(gravity: Vector2.zero()), + returnsNormally, + ); + }); + + flameTester.test( + 'screenToFlameWorld throws UnimpelementedError', + (game) async { + expect( + () => game.screenToFlameWorld(Vector2.zero()), + throwsUnimplementedError, + ); + }, + ); + + flameTester.test( + 'screenToWorld throws UnimpelementedError', + (game) async { + expect( + () => game.screenToWorld(Vector2.zero()), + throwsUnimplementedError, + ); + }, + ); + + flameTester.test( + 'worldToScreen throws UnimpelementedError', + (game) async { + expect( + () => game.worldToScreen(Vector2.zero()), + throwsUnimplementedError, + ); + }, + ); + }); +} diff --git a/test/game/components/controlled_ball_test.dart b/test/game/components/controlled_ball_test.dart index 17178e87..cfb3e157 100644 --- a/test/game/components/controlled_ball_test.dart +++ b/test/game/components/controlled_ball_test.dart @@ -2,7 +2,6 @@ import 'package:bloc_test/bloc_test.dart'; import 'package:flame/extensions.dart'; -import 'package:flame_forge2d/flame_forge2d.dart'; import 'package:flame_test/flame_test.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; @@ -15,7 +14,7 @@ import '../../helpers/helpers.dart'; // TODO(allisonryan0002): remove once // https://github.com/flame-engine/flame/pull/1520 is merged class _WrappedBallController extends BallController { - _WrappedBallController(Ball ball, this._gameRef) : super(ball); + _WrappedBallController(Ball ball, this._gameRef) : super(ball); final PinballGame _gameRef; From ca9679ba1dfe55c1bcb389139e18dce05242e3a6 Mon Sep 17 00:00:00 2001 From: Erick Date: Tue, 3 May 2022 17:06:00 -0300 Subject: [PATCH 10/10] feat: adding bumper sfx (#315) * feat: adding bumper sfx * feat: adding missing bumpers * Update packages/pinball_audio/lib/src/pinball_audio.dart Co-authored-by: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> Co-authored-by: Allison Ryan <77211884+allisonryan0002@users.noreply.github.com> --- .../android_acres/android_acres.dart | 6 +- .../flutter_forest/flutter_forest.dart | 8 +-- lib/game/components/scoring_behavior.dart | 21 +++++- lib/game/components/sparky_scorch.dart | 6 +- .../pinball_audio/assets/sfx/bumper_a.mp3 | Bin 0 -> 37660 bytes .../pinball_audio/assets/sfx/bumper_b.mp3 | Bin 0 -> 36406 bytes packages/pinball_audio/assets/sfx/plim.mp3 | Bin 18225 -> 0 bytes .../pinball_audio/lib/gen/assets.gen.dart | 3 +- .../pinball_audio/lib/src/pinball_audio.dart | 28 ++++++-- .../test/src/pinball_audio_test.dart | 68 +++++++++++++++--- .../components/scoring_behavior_test.dart | 67 +++++++++++++---- 11 files changed, 163 insertions(+), 44 deletions(-) create mode 100644 packages/pinball_audio/assets/sfx/bumper_a.mp3 create mode 100644 packages/pinball_audio/assets/sfx/bumper_b.mp3 delete mode 100644 packages/pinball_audio/assets/sfx/plim.mp3 diff --git a/lib/game/components/android_acres/android_acres.dart b/lib/game/components/android_acres/android_acres.dart index 3d1a8154..d29f38d7 100644 --- a/lib/game/components/android_acres/android_acres.dart +++ b/lib/game/components/android_acres/android_acres.dart @@ -25,17 +25,17 @@ class AndroidAcres extends Component { )..initialPosition = Vector2(-26, -28.25), AndroidBumper.a( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(-25, 1.3), AndroidBumper.b( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(-32.8, -9.2), AndroidBumper.cow( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(-20.5, -13.8), AndroidSpaceshipBonusBehavior(), diff --git a/lib/game/components/flutter_forest/flutter_forest.dart b/lib/game/components/flutter_forest/flutter_forest.dart index 1fb8907b..0f24a3b6 100644 --- a/lib/game/components/flutter_forest/flutter_forest.dart +++ b/lib/game/components/flutter_forest/flutter_forest.dart @@ -18,22 +18,22 @@ class FlutterForest extends Component with ZIndex { children: [ Signpost( children: [ - ScoringBehavior(points: Points.fiveThousand), + BumperScoringBehavior(points: Points.fiveThousand), ], )..initialPosition = Vector2(8.35, -58.3), DashNestBumper.main( children: [ - ScoringBehavior(points: Points.twoHundredThousand), + BumperScoringBehavior(points: Points.twoHundredThousand), ], )..initialPosition = Vector2(18.55, -59.35), DashNestBumper.a( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(8.95, -51.95), DashNestBumper.b( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(22.3, -46.75), DashAnimatronic()..position = Vector2(20, -66), diff --git a/lib/game/components/scoring_behavior.dart b/lib/game/components/scoring_behavior.dart index e8f51e90..f741e213 100644 --- a/lib/game/components/scoring_behavior.dart +++ b/lib/game/components/scoring_behavior.dart @@ -23,7 +23,6 @@ class ScoringBehavior extends ContactBehavior with HasGameRef { if (other is! Ball) return; gameRef.read().add(Scored(points: _points.value)); - gameRef.audio.score(); gameRef.firstChild()!.add( ScoreComponent( points: _points, @@ -32,3 +31,23 @@ class ScoringBehavior extends ContactBehavior with HasGameRef { ); } } + +/// {@template bumper_scoring_behavior} +/// A specific [ScoringBehavior] used for Bumpers. +/// In addition to its parent logic, also plays the +/// SFX for bumpers +/// {@endtemplate} +class BumperScoringBehavior extends ScoringBehavior { + /// {@macro bumper_scoring_behavior} + BumperScoringBehavior({ + required Points points, + }) : super(points: points); + + @override + void beginContact(Object other, Contact contact) { + super.beginContact(other, contact); + if (other is! Ball) return; + + gameRef.audio.bumper(); + } +} diff --git a/lib/game/components/sparky_scorch.dart b/lib/game/components/sparky_scorch.dart index 434e9479..f98f71d7 100644 --- a/lib/game/components/sparky_scorch.dart +++ b/lib/game/components/sparky_scorch.dart @@ -16,17 +16,17 @@ class SparkyScorch extends Component { children: [ SparkyBumper.a( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(-22.9, -41.65), SparkyBumper.b( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(-21.25, -57.9), SparkyBumper.c( children: [ - ScoringBehavior(points: Points.twentyThousand), + BumperScoringBehavior(points: Points.twentyThousand), ], )..initialPosition = Vector2(-3.3, -52.55), SparkyComputerSensor()..initialPosition = Vector2(-13, -49.9), diff --git a/packages/pinball_audio/assets/sfx/bumper_a.mp3 b/packages/pinball_audio/assets/sfx/bumper_a.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..76c0b0227c4c792c998e160c7509639e23daae8c GIT binary patch literal 37660 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 literal 0 HcmV?d00001 diff --git a/packages/pinball_audio/assets/sfx/bumper_b.mp3 b/packages/pinball_audio/assets/sfx/bumper_b.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..e409a018fc8b8dd0346c325d624455e9c5a30efe GIT binary patch literal 36406 zcmeFYao3>1HNfJU;K4%3hM;@%{oT4% z&x_|DxK+1b%(PU^oay@XIj8%aQB~ka2K-m(_4V`=|J`u`03?u&pQE4%m#`2QFAvZE zjQ;Nn{Hf*t)B69fs=7OR{2TfA7=S1Mkb(|C!^XzPCnhGRrlzN7X6E4G5fBg+m6VfH zQc_pf($h0GHaE9%Z~%kd-M#$%gM&juqvGO{lhe|&^Ye>~D=KOl8d_R9I(i2NMn@+m zW)~M%RyH!Z#`zJFm|9_4DQy37{|93S7-AvfC`~P(R zzx)3!Gw_c%djJ6WM0y0p;Q*k0LK;&+10X$)lPjn9HT69wA~+Hj=K5v z#A-#!5k%J2o2(;D1@s(#B*1Aqu&AGwtNDvwDVW)+K*EtpMj5m!>T zS=R3ve}z%T1*I$sOvKi1CG$6y1kGO-GCRyGlZiN!pvZ-2pbYo$89e=c`Ydw)lUibp z<@QL!@%4W27U2l=Ip7x~YqNiNxG2141pWpN=L&sAkNhcX9ho@769NbW@Jjw$Lum4w zi1_$VTXb}EK}OQ$n27`MilN!T=)~gtDm6y+{->eYf#IJ2O8;;vW~67ZtgOsrgwssu zPx)tFI2;!aAGtps`5E$v0Em;ZMh5^85fGf62f0j((&VsY=CHTl%_ec+uZb1*6=$Kl zpfJ!VkGG^LliIitX8=SsP}9m|iaymCjoMQxLc7r~ct<5s(t zC6ZUVh4#7R?X_+9`Xa1#-Cj^tuHN1yJ%+;J@bmL~t)aq@M<>yRW+_xa6b))2{AJ>7 z=<%p(%UlLoCbt1)YzH9?V6Wd#*AU{8_?o%A(&ub}&t#H{3#j8c!Tmz>W+xpb0{)iLYh7^yhfa1y29ufz>Gp!Sl06>G;BGwF5-j|1!jX+05mgl8b`Ae<%8;is^0Y zm#`uDQ=2^j043kS_*(J+5HLrfHCYNEzOC?hi48*-Yv#yFwFdNL+&Xi)$1xbHEH0vY zml-xB3S8?A=v_$}3Yk;`Elb*}n_r#YnJcb$e-OO;@Ht={;nEpQ9CY6HCN|k)hdMH*6(Ymd_HiMk5y?cDjxPZUH*B9Ue z_x~pKWtTg)wth5jtNs%bch0|$y7c^8K874`fq_Mprc&@e=?zjU`nZ(jdBUcWD(-ql z&{3F`W(?1Km`v(VO=>dzM*m_l`nvO;?jb(Q69euXg#=i-@`(B3)4<)79bt06L3ATQ zGn~2jCcgN!cPOeJ{?gQ3dv)>eMK61Bt(V(-M#Qq}xbe6DI%YxVRgOlEib9vN%0F^^ zd&^9Bx%g2DU4dxnl_gscFpcKeCDA7eCWN_Z(e-#=qj(%#?qb1~naNgXRF!O0h&{$5#y zZtlb3D^jP9FBbbJAD)_i%~=0JkT=Vz;;@L|BgFfsauI?e9*wOH%{>h|zqV@Y5bAG= zndX}d{f8VbB1*XB`W=>{wgYCrJC8#TQJ|Ymk|gKI1E<^PwC>cpHuP*MSg~=xmnpPK z&)cV?0#s-!N6#fjNZV^MhN_m31wAXw{Ock@1L1r_nd^raWrL)_*2bSXc0s;$stm=D zWSwR%M|;$uOd7~95sB$IOUH?Tc>Xl52c=KaSG1SH#*+B?G;4c^gm!Jq)~f?SIVZr( zm`=}es72Yi#Tc3C!6rnzyUAYKZZI#e2>L2jRuL>&|6G?{P z?8%InvGo__pXoGqOCqP{IP31 zd-lYzo}{jmE3uxuv`$xtQ`c5zNiV(Eet8Ck0Fd)H&6yr6zb+B&C=~-MSNph|d?xR;%_Z z>T|%TuB}p(9eXJqaRGyRM|e$1ysbc)AaT<7c1(f=2w7$s%is+#Tbc1*sxOdTL=F@U zthgR}u3NTUj&krN-rU-_c}4V;mB0l=FBzkNIcU#Tal@VhXt2*%Yy0)B~FB`{*}^dv&<5wWpQ<5$p<}#O*Pv` zlo7g1(>LV8Zc6Ma6&uBdnFuIlDij6M+)>|Kb`vQ`B9qOZ1J%&O=kqv{ z%q3j3{zHy93?2m9}hq?loDb6<(@Q3-#_fo+VLx1#IR;YRsHgSR;6EG zk?W78-@0bI0aFzD2`xilBJNH%Z!37{{s;Io+}~W?O4{m+mWH6iPA;|#;&Qu3$XpwG zBG#J=cij}7%!qNd<=!f`o508D0D58$(q4yq##3z~?zbH1asWhtuC)ao*ZhI2i~?3F zP=5h~x1qLNnlp>kJxTIqe#qBa6jXfpNzmXiUN-qq_hXgkOgH3PUt8Q!&CgG2%#d%n z2u~7ycuF$#s+F`ha`uQ(`6_?In6O9CD?bYcn&q2{$*?gB{MK?zx8zt9GhJ zZrd{Rj-A@DI=yV_e(S2R4b{i4DJj84Xq(STx<*0Bj}MTxeArzBO=6iW>;h?Uu{jyZm5-yLapW~NVU%9<@#a;vPi01}24*6Z#;JK%S93oG zogACR7)9-z_gOcmLBeMfZ$)DPsCUZ}kvmJ+e8mT{k*o^N`qZr1s)?a}o+}khpLts| z@*K|i^J45!(N?_)*$EG6vEeYiU%#vIt1?S1xO^qE!^8ajLEA>FvEzIkD10kvH*;?s zNJty#t63N46{w>FsnnfDDNN2SPGGR!_L|7>UDS7%EaCXM;UL;rvK{7geeV)@IIv)w0RS+pMilb2Qpedz zG15iyYdEe8s>cG`m3lmn@?N%!H(&Y#_J8_2VPR-a%WwRdZss@I?umsj2HWfo2Q}`_ ziIVhPEfgg;H$z~L=Un-W5qT$84}B^Owhs9mzg)yD6b@O{`R$kagcYDOXQHX^N`ZeM zI4<097}N_D`pXs-T;962gVlQmS2^<$g=tXhnO(-AQwP`%;XH}uWMy3X*juVH627o^Jd8r#KD zY78EiNBkyTt;3vTpj0e}yA7(Swbz@ms=!n<>k%5-`x3c-Ofp#XpDgsZ!c=K@=i zeW3zqf2;HJ&P_L!kd{%!f?9I@uLSpQ7Z4JVDeLp3v8~AO$=n$h z7S&Gm0Jd^?@evLcr4!9r$|=YBzR_bH;5(O@zF`774dQ_aK5`rb&3n9h#H?DLp(r{8 z^dPJy9+K~;c2gIcb=rUISYGAvRnnk=#LH(6iHd3Q+d}MXTH`hcwI5^BeeF{i@Dhyq zCgslO2c$c8BxM60mE-9l+k~dog!~p2Pc0f0*)of$c*O7 zEthBgAPiX(UujI_G1!C3@(w2j%c!O88dU-X<$e80fyLIR=HIH{_UbOt9{jSApT4g3 z?g?x8C5l6;Q<1b8cU=8FdlxubBZJw~sOfK{h(6b@)Q4;QgKWz-qanPDttC?>Oa>vQ z{oC2?A@LjbKRKiun5Y^W3iA2}+lR7Z{yWM$5-Lw>5Qi)~^d+SVeYw9QaOMUN8F1Zi~Z*!NdMoxam zoq^qa_{@o7R#Qm^Gza2NQ$B&95c4A(X~p?^(d0Tr7J#II#)80+P^WLt2ILrAFtHE& zPJ*JgTqd$Bl=3*BMZhf2$s5=8>1p4P)D`EB-I>7u!AYDSKRCu)SP~-wecFP14vw`>ooTJjhh{_w(=bZb(rgucV996L1;6j&U-58vS z!Gb^oEJgv>y&yINaS&=>uaku8k7bDf7)?cBZmfqpjO);{0N1`eKK<9D;^@ms!s!yH zEglU3u!n^p?BKLxgrZ~Us;Tjc05ZFz%V+EpCduE{a%rr&L`lkGd7p`lc*gb}{S969 zy5aYNhW5FIPsB^eItKWS$x2m2wOdl0AKeZ5PqvCl6&S@X4qdX$PL#)QC)we@cLaTw zBRms*5iNgZ(S}X^qYObE@m}yO+A*BCG}W$NlNU|#$4?eff4PHXo^#BFtOe+pqU{9v zGZEXza|Zn5|Bxe#K;gF1SwXkL3uIR-l9;kL4D^=)4Umtlak2^IlpY-0Mx-62D!A#% z|CX#5f{At3&+AuE@;^dLr@joZrk~>I8C{i=^SNLU)5&9}Gr8v&=VRtuEG^6^ei`QT zpzJIB0MjVRzI^C+aN*Wdj)|RH+=Xv%`@!p~K4=d(>j^cR=?S|K3{JVJ^tgarb$Gu?0XZ5&Ckv~N_ZJYj z;!C`q%3$=N^44{o&3a-#B(FJ*C=`-UMnoyRembsUJbng7NL$siqLAm?V%S|PGwUUaqAn&Lm-P{)r5PQSq#C8^`Mqwy<3X`{tm!oK7M`Y~3_J!rPk z>)(QM(sC_(gjfkUlCtF}8wtL0yfhI4g%tSsF;DemV)RJ_#a1lIoL6Etv=0BavfWWY zHI`Tp%O{Lc#hQK;xFjD;Q&4^}voK}w-sjZs$Prbd-xX5LqV!A5RsfK-M&Kbs{JrU9 zAZ@M6lynJR--~hhy5jUvJMR2$;f0mimWpS~!qKG$h9rvX z`Mm|r3ceVCN)2mH22s6%X?XEwAPGrz9xr@zMI(*&&Lu)BGmDqK^%u_t7`8BiXJiS} zIjh7f1SD4S&HgqRe8iKv;=o6a7~$*xl#ZaM?#tG589eWS{$ zv`&R#w*iBLM_cUHx(Bv8+KD-6jy1`fcNxd6Ke;I&Y0m1%5rbYY>wFa z!PJgtbNN=$Az{Gy8*<*#0|kk!n96L%rd^J+b@Fau_D`z}Zww4u>Q?LgSBt!=trGg| zRp%zA-<*)?<8*az@7l>;UH;iw>tKI$lCUxY2}*Eaq!LV&d`!<72stULu@@d(yW*7Y z%ux3jB_iD#Qv~^NFHd))?_C_>0mAUm0069h7P^e9`Y39G$IW)+ zomAlN_8NAUp03%hgbYnH)GwbG0~3w(VQ{{eA^jhpAaMzjBd%|)PLPOjS!M%|mj!ly z#Q1W)luU+DQ?;d>sr=A|Pfb}5cb+e^kRk#wKnR)Do-L}K=zVl@#h8^U(P?%vDv@cS zrs}$JO$so(x?PlRzsrh6qDX}Zu9Q}1c^@10?6R`NcCf8dH%X)kNRQ?0&= z$;H^^XULv=kbhUBJ~r6kuJZ6Q*!uTXFx4)cBV;9|REDw+L%8J|T;D%BfT7!iHmTPuA5P8zt0cQtUK?eij(vc|WmJ5YJ2HIFKz8{i9v z>_wuS_bw|SNOq%jxA1;Yd5q1gQvc-AABeIZiVuf@IerYiz@*^@p#zFN$$@{J>?~)g zm~edY00?>^sY-nsU&vHb&vQx7L@)_n%U7`FPs^!djSFXAuovWYMRxI@gDS`i6UU6N zL9O1@f$gZ9{~<>efjnutw1TVf%Lh}`QA5&E^+ zhV2q&$@|K&I2jrx0ou<)X4x7mCWA-eU=!X~SN9CE-Br($Q1-tiLF2FYc?NDPljFq* zv}T%vKhB;rWj}mp>#d7#Rw3WL;~kDw7%>Ze!M+H|Ng~p&r6D+ZiP2+#dP&EdY#|R* zCke$}>NFbvq#fy^SBN%LI=vN4yv|FuaOr3|W^aCWW&aaY^#!!5D50?uytDoha!ZHg zy-p`9(KbN69g|k^-L_-tgJA%jtKQPa`6Q?L-4b`>3x2Se_9$cW9E<6!2@@hRmkdKg zv;}#lD#EWQyV5rEI2cmMgy~}~Hw!gzyQMOymoD-^xHET*%D|QpQHqwxziY?EL)SAo z9?j8u@ZTWgP4&9eL5>NC$1Gk za1lRO!U*-N(AK##xE-_kp7@TOz2a9!5~Am<pBo@$em zL`HsoeMJ7071@fNwersBeg*rUyWxh;UEqVATlNPxJMzg_p++hGBqqhOW3bePRjl~4 zN5CRH5Nq1_Ojhkb}LdC7#RAxflyU z(`kI-vPf~p++AU}K1b&5omN*|%j}$;O|-b|#@x}(>9pv_u2A%=Zqo~&ibqv-tCE-L zUj0LIV&iQsPoR?DE2>CPz}@GJJ~(s4lNu+xXxL%D}C{afCY0 zPEi0Z?9*kb$8m3JD7y?LQ=fdJP=Tn@Gi2K#u|~3(vfg#uQ>t!3_Hzv#$(AhIB z@M2x$Sx_T$O`6D8cu0&ZAG-Rdtw7iw4}J4%KPmpo>jh+vITbXn%tp7CtTv>onwLRf zayL_~@Q7KjxanM^*kO`s;mwe&iYa=>trXP(@ZmuNlZ2Ep0N*7XB!8)ooHf8yC}QHa2J*a!(4? z+$T>mo&8AvG;6qP``Y~cmQe4t~V#!#941&(_ zlzj>v&fuFhBB%7D|B$l_Lmt=B66Y59Xg5l zjPQNC`Wp}xE&TP?5%cm72{4Tx}cDRsEuE%SuO zfXcb&++wYg0q9o|she&QK)@b$_tRCC)JOd?`1A9^(-3LWoIxtD5X%OLmsnP$f7ePW z1=d7lIc8C2wCV%(X!$|nG!KRq$;JE;Fxt#lS-$D-lHOlm7=pj1l2G(&;0iw|NO?j_ z0y;x`^T4s$``ApccXJ?3b*2@zPW(W1WW5%(bS0c(Ius+19u@!s?fmbV{PbeX+*pRu zIwr;oZOS&s7z0FoduOu8J(}s@0C5697(K7}7i(iH2ZHV7k!hka#|{2W5}vNhZ1I z`aLaww@bc)xqN{gV7Th^a>VHEa9$aCD>zSI<}aJI!74v}usuNM=X(^ppd;s7-3)c{ z*7#L{%5Sht)~En2vkCvsbc};Sg`LTP3c>B|>@lqg4ZZEpfTO7*gaH6}T%GAlAH`t}{g&a`|KJdPBdksy=}~SDOWB zrQ4v$@`>|8*iw50xgtp3Pa6QF>c(pc#L-hNlW|Ho6xLtkZz{2UQ&OCc373`hjbJc8TJGAnu4J^BSR8iz!@60{kw4aqQ#F9S(M9fnD z4Bw}gHu;McAX1~op%3jbnFNOM$N~VSPG&0T*1)t$8pJ8^e z%l1*3!o;$P+i%l+k9w5Mm;Wwy=rt=RkHoOth0Qd3>a8yb1dL?JJILzAAmv)-`-7eq z7fCqE;>g2}MKI;O?U!G{;N;``KG*8RCsX$BW0PdPk<;p|{iTQ69~5AXONPspXC()j zFN=qmosi1z*OFj=yV`b$S+D_|jk(TuIcP4*Ktt~eQuNz`dA1=77TmO`K@NxcYOil< zwj=%CdhM*xJ9X@qL`FfQ!Q1HC9L9b>oHkk-j;L0t;XBP>*z%3I%|Z0to)J;C3Bhy? z-6|tx<4b^9BAI=f=xi|LW6lo)2rK|556?6H*{ff5a{2y}dVaOjr+80>vrS6w?k~YbvdPLr`4PznUwG3y1F@nw=?;=t4;v?BDZo9LPHGAfx|t^bve# zKSQ!As8P#7<%$#0>=sv-t4%e%7EKS!L*6oY)VgRy>5=ohz;h3W z3rDBYnwLJ!oKsX--)s3ceBdGow#$9laaQ?Wg#mSkbzm%W{+()+OO99e)(>h58bDgt zW}3m)2+JtXGK_`PE=e{*Tb}jvm!d2~V`ka|Q%&S1Rq`0C6DBX?>W|VG+1=P(fu!81 z?{*iF%-*xIh3&?ido%1QiI%HMo||c2@3m_bgu?e=7bKz2P6f0gVfx*&4K4Rx?PhDR zi)1*j9kw_R9VfZul%H7H8wVREU*-Hwf~2_R(l11B>U*6u=RPS?MPH5S{Y&LZ=qhNs zG}Qb-o1QJgP{70y9sV@+*S_NP4U6zlQJ?;=qCxn@>_Oo)m2*+hhTOn)jU)hRK^K&V{B8 z(vDRw89tW`#>9k1M|j$3`jYCb35(Bz6Ttq_fnCkLgs2#Y>3du2b4RS3<(w--q7m;3<_9t~)`Gqz5t4g*hu&$YMkjASm zMhFuZecRcC70}`CnA4E#w<@?v#s)6O z*EwrxLY7~lJd&sT*8O|;Y+A^<@JuEpBT15>Hc-dRgq+gXu_uC5ezm7c(-963*l2Y~^r0n;TF|3cmkH zYRBP^7KMO@5Eez3+CSI16l{AP+3#Wj*$Q}{isp$%tY;|5fP(+22}5a}98}(8oMmUk z>L%&hb)!3Zv(`UX2;J(?mn6n-bTZ!20zg2;7k*y)fx@ACXDRU<=29XDN@U`!6g}-N zY1MUONzDqa3cmKi3=7u{eL+pfss{COP02vwNr2;B_l_ex0_&dEW@8w{I42%DIrxy$!~CRNE& z(z zj24az!4|Q4(qE8(LMr~}kmM!~CCM4Yug9J0tKuRlF|$m>sKuipvlISQ?JOAE*~7T? z&6-tNBa{Pd1gY2+IGD!Qe|m>O*Z8ZPiPPh7eqiqKErJqC4cxTM_u~TW*?cWz-=r*^ zST)0p(;x0{baRlu`%D`$Jq8&WH> z*z;i|*93q_uO(xVwDkoWIR$5g2{V5>BZ_FG*i2EqwgZoth?&S-ZX@+4M_2T-|JO~e z_7PiUG)(H^nU59-gLkQ8P4i}cbqeu_I0l!Hp!(bx&_|3e$8%Uu|A$a>os_>TJBm$` zt*`#-!%dw)nNZAsmQb@2jxf#c{Ib_RG`#jm zw0c$1^iPb6^R>^tu7_U<^yO*2>s>=clR;2o%+Fl-qIChrZKqIFN@G1L>Lonpc=bp& zKkj04(m>FfV6CR1uxhB(TuqrrlADP7J}GEExn5SHRYNNf4e-0}YI zc@(tJ8Dft|{@jmo6>>>Jid96=iXIq;{&y$Et+l#x{Z`Z%!^$IOHSRET%Scoi8UVT# z5=U;iO&WnkJHEttDt}m#7rt!GU(zZ2W@RCfaeSUmls!~VoRIz&_oj@tIr3)-YZWDh zevFv17>A5@x9Q*U%d?z2g=8!^+!_Vl0A-X2&VWY74M%0Jqdk7u8JI)w8^2X&r`JyY zV7f0&`8kBg2m;(h9wk7UP{~QM(o6PsT8qf~yf!$HrbT(eX+$8;e8JJzzxR50y8cjd z-ObJ4{c@nWI4!sZKOijS{!h!@M4?zYg9^BnTEbmTwybBM#2zc|i(W6E0~ z-#*X2&6XqReqFiDl3$OYFeVU3#A7s4+^^AyQKW}vYQKYfo*4gf33~foB^V-XPbfDW zHwyt0a_0~`PnFxpr>{k%iMaXuva0Mgb?iUjDGZd%#qB>TRQ#EtM{D_3rho6

*&< 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 K|MkD0z<&S@pjj;d literal 0 HcmV?d00001 diff --git a/packages/pinball_audio/assets/sfx/plim.mp3 b/packages/pinball_audio/assets/sfx/plim.mp3 deleted file mode 100644 index a726024da3495b9b720e92612641c30c1a8cf4f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18225 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 bH?DsI>;LMT`oH>k|64Zff1lL 'assets/sfx/bumper_a.mp3'; + String get bumperB => 'assets/sfx/bumper_b.mp3'; String get google => 'assets/sfx/google.mp3'; String get ioPinballVoiceOver => 'assets/sfx/io_pinball_voice_over.mp3'; - String get plim => 'assets/sfx/plim.mp3'; } class Assets { diff --git a/packages/pinball_audio/lib/src/pinball_audio.dart b/packages/pinball_audio/lib/src/pinball_audio.dart index f87b05d1..07257fea 100644 --- a/packages/pinball_audio/lib/src/pinball_audio.dart +++ b/packages/pinball_audio/lib/src/pinball_audio.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:audioplayers/audioplayers.dart'; import 'package:flame_audio/audio_pool.dart'; import 'package:flame_audio/flame_audio.dart'; @@ -40,6 +42,7 @@ class PinballAudio { LoopSingleAudio? loopSingleAudio, PreCacheSingleAudio? preCacheSingleAudio, ConfigureAudioCache? configureAudioCache, + Random? seed, }) : _createAudioPool = createAudioPool ?? AudioPool.create, _playSingleAudio = playSingleAudio ?? FlameAudio.audioCache.play, _loopSingleAudio = loopSingleAudio ?? FlameAudio.audioCache.loop, @@ -48,7 +51,8 @@ class PinballAudio { _configureAudioCache = configureAudioCache ?? ((AudioCache a) { a.prefix = ''; - }); + }), + _seed = seed ?? Random(); final CreateAudioPool _createAudioPool; @@ -60,14 +64,24 @@ class PinballAudio { final ConfigureAudioCache _configureAudioCache; - late AudioPool _scorePool; + final Random _seed; + + late AudioPool _bumperAPool; + + late AudioPool _bumperBPool; /// Loads the sounds effects into the memory Future load() async { _configureAudioCache(FlameAudio.audioCache); - _scorePool = await _createAudioPool( - _prefixFile(Assets.sfx.plim), + _bumperAPool = await _createAudioPool( + _prefixFile(Assets.sfx.bumperA), + maxPlayers: 4, + prefix: '', + ); + + _bumperBPool = await _createAudioPool( + _prefixFile(Assets.sfx.bumperB), maxPlayers: 4, prefix: '', ); @@ -79,9 +93,9 @@ class PinballAudio { ]); } - /// Plays the basic score sound - void score() { - _scorePool.start(); + /// Plays a random bumper sfx. + void bumper() { + (_seed.nextBool() ? _bumperAPool : _bumperBPool).start(volume: 0.6); } /// Plays the google word bonus diff --git a/packages/pinball_audio/test/src/pinball_audio_test.dart b/packages/pinball_audio/test/src/pinball_audio_test.dart index 9d6dff98..916d0f34 100644 --- a/packages/pinball_audio/test/src/pinball_audio_test.dart +++ b/packages/pinball_audio/test/src/pinball_audio_test.dart @@ -1,4 +1,6 @@ // ignore_for_file: prefer_const_constructors, one_member_abstracts +import 'dart:math'; + import 'package:audioplayers/audioplayers.dart'; import 'package:flame_audio/audio_pool.dart'; import 'package:flame_audio/flame_audio.dart'; @@ -39,6 +41,8 @@ abstract class _PreCacheSingleAudio { class _MockPreCacheSingleAudio extends Mock implements _PreCacheSingleAudio {} +class _MockRandom extends Mock implements Random {} + void main() { group('PinballAudio', () { late _MockCreateAudioPool createAudioPool; @@ -46,6 +50,7 @@ void main() { late _MockPlaySingleAudio playSingleAudio; late _MockLoopSingleAudio loopSingleAudio; late _PreCacheSingleAudio preCacheSingleAudio; + late Random seed; late PinballAudio audio; setUpAll(() { @@ -74,12 +79,15 @@ void main() { preCacheSingleAudio = _MockPreCacheSingleAudio(); when(() => preCacheSingleAudio.onCall(any())).thenAnswer((_) async {}); + seed = _MockRandom(); + audio = PinballAudio( configureAudioCache: configureAudioCache.onCall, createAudioPool: createAudioPool.onCall, playSingleAudio: playSingleAudio.onCall, loopSingleAudio: loopSingleAudio.onCall, preCacheSingleAudio: preCacheSingleAudio.onCall, + seed: seed, ); }); @@ -88,12 +96,20 @@ void main() { }); group('load', () { - test('creates the score pool', () async { + test('creates the bumpers pools', () async { await audio.load(); verify( () => createAudioPool.onCall( - 'packages/pinball_audio/${Assets.sfx.plim}', + 'packages/pinball_audio/${Assets.sfx.bumperA}', + maxPlayers: 4, + prefix: '', + ), + ).called(1); + + verify( + () => createAudioPool.onCall( + 'packages/pinball_audio/${Assets.sfx.bumperB}', maxPlayers: 4, prefix: '', ), @@ -137,22 +153,52 @@ void main() { }); }); - group('score', () { - test('plays the score sound pool', () async { - final audioPool = _MockAudioPool(); - when(audioPool.start).thenAnswer((_) async => () {}); + group('bumper', () { + late AudioPool bumperAPool; + late AudioPool bumperBPool; + + setUp(() { + bumperAPool = _MockAudioPool(); + when(() => bumperAPool.start(volume: any(named: 'volume'))) + .thenAnswer((_) async => () {}); when( () => createAudioPool.onCall( - any(), + 'packages/pinball_audio/${Assets.sfx.bumperA}', maxPlayers: any(named: 'maxPlayers'), prefix: any(named: 'prefix'), ), - ).thenAnswer((_) async => audioPool); + ).thenAnswer((_) async => bumperAPool); - await audio.load(); - audio.score(); + bumperBPool = _MockAudioPool(); + when(() => bumperBPool.start(volume: any(named: 'volume'))) + .thenAnswer((_) async => () {}); + when( + () => createAudioPool.onCall( + 'packages/pinball_audio/${Assets.sfx.bumperB}', + maxPlayers: any(named: 'maxPlayers'), + prefix: any(named: 'prefix'), + ), + ).thenAnswer((_) async => bumperBPool); + }); + + group('when seed is true', () { + test('plays the bumper A sound pool', () async { + when(seed.nextBool).thenReturn(true); + await audio.load(); + audio.bumper(); + + verify(() => bumperAPool.start(volume: 0.6)).called(1); + }); + }); + + group('when seed is false', () { + test('plays the bumper B sound pool', () async { + when(seed.nextBool).thenReturn(false); + await audio.load(); + audio.bumper(); - verify(audioPool.start).called(1); + verify(() => bumperBPool.start(volume: 0.6)).called(1); + }); }); }); diff --git a/test/game/components/scoring_behavior_test.dart b/test/game/components/scoring_behavior_test.dart index 485183aa..3e0f7fb4 100644 --- a/test/game/components/scoring_behavior_test.dart +++ b/test/game/components/scoring_behavior_test.dart @@ -90,20 +90,6 @@ void main() { }, ); - flameBlocTester.testGameWidget( - 'plays score sound', - setUp: (game, tester) async { - final scoringBehavior = ScoringBehavior(points: Points.oneMillion); - await parent.add(scoringBehavior); - final canvas = ZCanvasComponent(children: [parent]); - await game.ensureAdd(canvas); - - scoringBehavior.beginContact(ball, _MockContact()); - - verify(audio.score).called(1); - }, - ); - flameBlocTester.testGameWidget( "adds a ScoreComponent at Ball's position with points", setUp: (game, tester) async { @@ -130,4 +116,57 @@ void main() { ); }); }); + + group('BumperScoringBehavior', () { + group('beginContact', () { + late GameBloc bloc; + late PinballAudio audio; + late Ball ball; + late BodyComponent parent; + + setUp(() { + audio = _MockPinballAudio(); + ball = _MockBall(); + final ballBody = _MockBody(); + when(() => ball.body).thenReturn(ballBody); + when(() => ballBody.position).thenReturn(Vector2.all(4)); + + parent = _TestBodyComponent(); + }); + + final flameBlocTester = FlameBlocTester( + gameBuilder: () => EmptyPinballTestGame( + audio: audio, + ), + blocBuilder: () { + bloc = _MockGameBloc(); + const state = GameState( + score: 0, + multiplier: 1, + rounds: 3, + bonusHistory: [], + ); + whenListen(bloc, Stream.value(state), initialState: state); + return bloc; + }, + assets: assets, + ); + + flameBlocTester.testGameWidget( + 'plays bumper sound', + setUp: (game, tester) async { + final scoringBehavior = BumperScoringBehavior( + points: Points.oneMillion, + ); + await parent.add(scoringBehavior); + final canvas = ZCanvasComponent(children: [parent]); + await game.ensureAdd(canvas); + + scoringBehavior.beginContact(ball, _MockContact()); + + verify(audio.bumper).called(1); + }, + ); + }); + }); }