From 0d68f1a24b38b1b68833a88de1e1fbffe4a4d157 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Mon, 29 Apr 2019 21:07:58 +0100 Subject: [PATCH 1/4] update react native video version --- app/package-lock.json | 52 +++++++++++-------- app/package.json | 4 +- .../lbry/build/templates/build.tmpl.gradle | 5 ++ 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/app/package-lock.json b/app/package-lock.json index d51fbf6c..1a8c2474 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -956,11 +956,11 @@ "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=" }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.6.tgz", + "integrity": "sha512-QsaoUD2dpVpjENy8JFpQnXP9vyzoZPmAoKrE3S6HtSB7qzSebkJNnmdY4p004FQUSSiHXPueENpoeuUW/7a8Ig==", "requires": { - "mime-types": "~2.1.18", + "mime-types": "~2.1.24", "negotiator": "0.6.1" } }, @@ -3517,9 +3517,9 @@ "integrity": "sha1-qG5e5r2qFgVEddp5fM3fDFVphJE=" }, "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.1.tgz", + "integrity": "sha512-MXmFv3KYbv7MPjPeGlFCTieXB9zNvmHfy4fXzZbrdMeUUk3pxQ8SS0cJ6CcwUDZnIL3ZDa01qQFzhlusB8s51Q==" }, "exec-sh": { "version": "0.2.2", @@ -3796,9 +3796,9 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.8.tgz", - "integrity": "sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", "optional": true, "requires": { "nan": "^2.12.1", @@ -4823,8 +4823,8 @@ } }, "lbry-redux": { - "version": "github:lbryio/lbry-redux#17389f806d1b3d266e8cfcd9c8973c81eec2be4b", - "from": "github:lbryio/lbry-redux#claim-search-fix", + "version": "github:lbryio/lbry-redux#4b3769fc2dcc4c93771aa4c5dbb64d0e97f6375f", + "from": "github:lbryio/lbry-redux", "requires": { "proxy-polyfill": "0.1.6", "reselect": "^3.0.0", @@ -4832,8 +4832,8 @@ } }, "lbryinc": { - "version": "github:lbryio/lbryinc#bec7ce1fba7fb0d90f604170ee00c75b3d8ab7ed", - "from": "github:lbryio/lbryinc#sdk-0.36-changes", + "version": "github:lbryio/lbryinc#a8fd592c46abb65410785fd0242e91904c158fd7", + "from": "github:lbryio/lbryinc", "requires": { "reselect": "^3.0.0" } @@ -6062,9 +6062,9 @@ } }, "query-string": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.4.2.tgz", - "integrity": "sha512-DfJqAen17LfLA3rQ+H5S4uXphrF+ANU1lT2ijds4V/Tj4gZxA3gx5/tg1bz7kYCmwna7LyJNCYqO7jNRzo3aLw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.5.0.tgz", + "integrity": "sha512-TYC4hDjZSvVxLMEucDMySkuAS9UIzSbAiYGyA9GWCjLKB8fQpviFbjd20fD7uejCDxZS+ftSdBKE6DS+xucJFg==", "requires": { "decode-uri-component": "^0.2.0", "split-on-first": "^1.0.0", @@ -6294,9 +6294,9 @@ "integrity": "sha512-pqp9loZbWHW2pVcaAItV5rtEpj6RyPnk0mRlsxRZpbJvrJArJwRMd+WT8BzC+OyTDV1TOdFJCOxDyVNL9I2XTw==" }, "react-native-gesture-handler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-1.1.0.tgz", - "integrity": "sha512-E9IKHpmL+sz/iCYkUriTUjBaQBORWV+oheYPQleADkxjo2sYsQfnlyTz4EQYFONkUwJ6WmfTNkYt2/yc5U4Ziw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-1.2.0.tgz", + "integrity": "sha512-PBsqfyUlzAQQXVEy5nDB8HpehSalhN8Vlc00VJ4RT0FDxlkbpl1otT6DxUN/shMEEuOkyS9gz80ZzWTfAmeBOQ==", "requires": { "hoist-non-react-statics": "^2.3.1", "invariant": "^2.2.2", @@ -6580,11 +6580,12 @@ } }, "react-native-video": { - "version": "github:lbryio/react-native-video#080395677f6ff2acd6273f4b614dd1a1f3714667", + "version": "github:lbryio/react-native-video#0b2ed972f12f8d85d8febaff0b191444fe29cb3f", "from": "github:lbryio/react-native-video#exoplayer-lbry-android", "requires": { - "keymirror": "0.1.1", - "prop-types": "^15.5.10" + "keymirror": "^0.1.1", + "prop-types": "^15.5.10", + "shaka-player": "^2.4.4" } }, "react-navigation": { @@ -7388,6 +7389,11 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, + "shaka-player": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/shaka-player/-/shaka-player-2.4.7.tgz", + "integrity": "sha512-KXYVB7snrrmcmDvusf2IIGOXZCvrlb6vXkl1q0pXP/QdUkvHm2SsW6jIXKvDz9xsvs9Pt/R7tm8POgfUOzybcQ==" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", diff --git a/app/package.json b/app/package.json index c45ac8ef..38d4c091 100644 --- a/app/package.json +++ b/app/package.json @@ -8,8 +8,8 @@ "dependencies": { "base-64": "^0.1.0", "@expo/vector-icons": "^8.1.0", - "lbry-redux": "lbryio/lbry-redux#claim-search-fix", - "lbryinc": "lbryio/lbryinc#sdk-0.36-changes", + "lbry-redux": "lbryio/lbry-redux", + "lbryinc": "lbryio/lbryinc", "lodash": ">=4.17.11", "merge": ">=1.2.1", "moment": "^2.22.1", diff --git a/p4a/pythonforandroid/bootstraps/lbry/build/templates/build.tmpl.gradle b/p4a/pythonforandroid/bootstraps/lbry/build/templates/build.tmpl.gradle index 6f739abd..fcde802a 100644 --- a/p4a/pythonforandroid/bootstraps/lbry/build/templates/build.tmpl.gradle +++ b/p4a/pythonforandroid/bootstraps/lbry/build/templates/build.tmpl.gradle @@ -41,6 +41,11 @@ android { } } + compileOptions { + sourceCompatibility 1.8 + targetCompatibility 1.8 + } + dexOptions { jumboMode true } -- 2.45.3 From a6bd8c1e659b0dd5280f881d6e97f960cfbc16e0 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 1 May 2019 09:19:19 +0100 Subject: [PATCH 2/4] replace mixpanel with firebase analytics --- .gitignore | 2 + .gitsecret/paths/mapping.cfg | 1 + app/package.json | 4 +- app/src/component/fileDownloadButton/view.js | 4 +- app/src/component/fileItem/view.js | 4 +- app/src/component/searchInput/index.js | 4 +- app/src/index.js | 4 +- app/src/page/discover/view.js | 6 +- app/src/page/file/view.js | 12 +-- app/src/page/splash/view.js | 4 +- buildozer.spec.sample | 2 +- buildozer.spec.travis | 2 +- buildozer.spec.vagrant | 2 +- .../bootstraps/lbry/build/build.py | 8 +- .../lbry/build/templates/build.tmpl.gradle | 9 ++ .../{settings.tmpl.gradle => settings.gradle} | 0 .../browser/reactmodules/FirebaseModule.java | 80 +++++++++++++++++ .../browser/reactmodules/MixpanelModule.java | 87 ------------------- .../reactpackages/LbryReactPackage.java | 4 +- 19 files changed, 122 insertions(+), 117 deletions(-) rename p4a/pythonforandroid/bootstraps/lbry/build/templates/{settings.tmpl.gradle => settings.gradle} (100%) create mode 100644 src/main/java/io/lbry/browser/reactmodules/FirebaseModule.java delete mode 100644 src/main/java/io/lbry/browser/reactmodules/MixpanelModule.java diff --git a/.gitignore b/.gitignore index 012766ba..47509c25 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,6 @@ src/main/assets/index.android.bundle.meta .vagrant lbry-android.keystore +p4a/pythonforandroid/bootstraps/lbry/build/templates/google-services.json .gitsecret/keys/random_seed + diff --git a/.gitsecret/paths/mapping.cfg b/.gitsecret/paths/mapping.cfg index dba90436..3c5cb735 100644 --- a/.gitsecret/paths/mapping.cfg +++ b/.gitsecret/paths/mapping.cfg @@ -1 +1,2 @@ lbry-android.keystore: +p4a/pythonforandroid/bootstraps/lbry/build/templates/google-services.json diff --git a/app/package.json b/app/package.json index c45ac8ef..38d4c091 100644 --- a/app/package.json +++ b/app/package.json @@ -8,8 +8,8 @@ "dependencies": { "base-64": "^0.1.0", "@expo/vector-icons": "^8.1.0", - "lbry-redux": "lbryio/lbry-redux#claim-search-fix", - "lbryinc": "lbryio/lbryinc#sdk-0.36-changes", + "lbry-redux": "lbryio/lbry-redux", + "lbryinc": "lbryio/lbryinc", "lodash": ">=4.17.11", "merge": ">=1.2.1", "moment": "^2.22.1", diff --git a/app/src/component/fileDownloadButton/view.js b/app/src/component/fileDownloadButton/view.js index 985a3a26..c3260167 100644 --- a/app/src/component/fileDownloadButton/view.js +++ b/app/src/component/fileDownloadButton/view.js @@ -73,8 +73,8 @@ class FileDownloadButton extends React.PureComponent { text={(isPlayable ? 'Play' : (isViewable ? 'View' : 'Download'))} onLayout={onButtonLayout} style={[style, fileDownloadButtonStyle.container]} onPress={() => { - if (NativeModules.Mixpanel) { - NativeModules.Mixpanel.track('Purchase Uri', { Uri: uri }); + if (NativeModules.Firebase) { + NativeModules.Firebase.track('purchase_uri', { uri: uri }); } purchaseUri(uri, onStartDownloadFailed); if (isPlayable && onPlay) { diff --git a/app/src/component/fileItem/view.js b/app/src/component/fileItem/view.js index 3ca2f773..c4b60f9b 100644 --- a/app/src/component/fileItem/view.js +++ b/app/src/component/fileItem/view.js @@ -36,8 +36,8 @@ class FileItem extends React.PureComponent { navigateToFileUri = () => { const { navigation, uri } = this.props; const normalizedUri = normalizeURI(uri); - if (NativeModules.Mixpanel) { - NativeModules.Mixpanel.track('Discover Tap', { Uri: normalizeURI }); + if (NativeModules.Firebase) { + NativeModules.Firebase.track('explore_click', { uri: normalizedUri }); } navigateToUri(navigation, normalizedUri); } diff --git a/app/src/component/searchInput/index.js b/app/src/component/searchInput/index.js index a7cefcb8..5469f359 100644 --- a/app/src/component/searchInput/index.js +++ b/app/src/component/searchInput/index.js @@ -5,8 +5,8 @@ import SearchInput from './view'; const perform = dispatch => ({ search: search => { - if (NativeModules.Mixpanel) { - NativeModules.Mixpanel.track('Search', { Query: search }); + if (NativeModules.Firebase) { + NativeModules.Firebase.track('search', { query: search }); } return dispatch(doSearch(search)); }, diff --git a/app/src/index.js b/app/src/index.js index f8dff4e2..6c5892a5 100644 --- a/app/src/index.js +++ b/app/src/index.js @@ -43,8 +43,8 @@ import thunk from 'redux-thunk'; const globalExceptionHandler = (error, isFatal) => { - if (error && NativeModules.Mixpanel) { - NativeModules.Mixpanel.logException(isFatal, error.message ? error.message : "No message", error); + if (error && NativeModules.Firebase) { + NativeModules.Firebase.logException(isFatal, error.message ? error.message : "No message", error); } }; setJSExceptionHandler(globalExceptionHandler, true); diff --git a/app/src/page/discover/view.js b/app/src/page/discover/view.js index 32e8674b..4bf95f03 100644 --- a/app/src/page/discover/view.js +++ b/app/src/page/discover/view.js @@ -34,9 +34,9 @@ class DiscoverPage extends React.PureComponent { AsyncStorage.getItem('firstLaunchSuspended').then(suspended => { AsyncStorage.removeItem('firstLaunchSuspended'); const appSuspended = (suspended === 'true'); - if (NativeModules.Mixpanel) { - NativeModules.Mixpanel.track('First Run Time', { - 'Total Seconds': delta, 'App Suspended': appSuspended + if (NativeModules.Firebase) { + NativeModules.Firebase.track('first_run_time', { + 'total_seconds': delta, 'app_suspended': appSuspended }); } }); diff --git a/app/src/page/file/view.js b/app/src/page/file/view.js index 42da2f5a..6f0f8518 100644 --- a/app/src/page/file/view.js +++ b/app/src/page/file/view.js @@ -88,8 +88,8 @@ class FilePage extends React.PureComponent { this.fetchFileInfo(this.props); this.fetchCostInfo(this.props); - if (NativeModules.Mixpanel) { - NativeModules.Mixpanel.track('Open File Page', { Uri: uri }); + if (NativeModules.Firebase) { + NativeModules.Firebase.track('open_file_page', { uri: uri }); } if (NativeModules.UtilityModule) { NativeModules.UtilityModule.keepAwakeOn(); @@ -301,12 +301,12 @@ class FilePage extends React.PureComponent { const { uri } = navigation.state.params; this.logFileView(uri, fileInfo, timeToStartMillis); - let payload = { 'Uri': uri }; + let payload = { 'uri': uri }; if (!isNaN(timeToStart)) { - payload['Time to Start (seconds)'] = timeToStart; - payload['Time to Start (ms)'] = timeToStartMillis; + payload['time_to_start_seconds'] = timeToStart; + payload['time_to_start_ms'] = timeToStartMillis; } - NativeModules.Mixpanel.track('Play', payload); + NativeModules.Firebase.track('play', payload); } onPlaybackFinished = () => { diff --git a/app/src/page/splash/view.js b/app/src/page/splash/view.js index 3365adcf..1df1e394 100644 --- a/app/src/page/splash/view.js +++ b/app/src/page/splash/view.js @@ -254,8 +254,8 @@ class SplashScreen extends React.PureComponent { } componentDidMount() { - if (NativeModules.Mixpanel) { - NativeModules.Mixpanel.track('App Launch', null); + if (NativeModules.Firebase) { + NativeModules.Firebase.track('app_launch', null); } Linking.getInitialURL().then((url) => { diff --git a/buildozer.spec.sample b/buildozer.spec.sample index cb4aec9d..2a10e128 100644 --- a/buildozer.spec.sample +++ b/buildozer.spec.sample @@ -148,7 +148,7 @@ android.react_src = ./app # (list) Gradle dependencies to add (currently works only with sdl2_gradle # bootstrap) -android.gradle_dependencies = com.android.support:support-v4:27.1.1, com.android.support:support-media-compat:27.1.1, com.android.support:appcompat-v7:27.1.1, com.facebook.react:react-native:0.59.3, com.mixpanel.android:mixpanel-android:5+, com.google.android.gms:play-services-gcm:11.0.4+, com.facebook.fresco:fresco:1.9.0, com.facebook.fresco:animated-gif:1.9.0, com.squareup.picasso:picasso:2.71828 +android.gradle_dependencies = com.android.support:support-v4:27.1.1, com.android.support:support-media-compat:27.1.1, com.android.support:appcompat-v7:27.1.1, com.facebook.react:react-native:0.59.3, com.google.android.gms:play-services-gcm:11.0.4+, com.facebook.fresco:fresco:1.9.0, com.facebook.fresco:animated-gif:1.9.0, com.squareup.picasso:picasso:2.71828, com.google.firebase:firebase-core:16.0.1 # (str) python-for-android branch to use, defaults to master #p4a.branch = stable diff --git a/buildozer.spec.travis b/buildozer.spec.travis index cb4aec9d..2a10e128 100644 --- a/buildozer.spec.travis +++ b/buildozer.spec.travis @@ -148,7 +148,7 @@ android.react_src = ./app # (list) Gradle dependencies to add (currently works only with sdl2_gradle # bootstrap) -android.gradle_dependencies = com.android.support:support-v4:27.1.1, com.android.support:support-media-compat:27.1.1, com.android.support:appcompat-v7:27.1.1, com.facebook.react:react-native:0.59.3, com.mixpanel.android:mixpanel-android:5+, com.google.android.gms:play-services-gcm:11.0.4+, com.facebook.fresco:fresco:1.9.0, com.facebook.fresco:animated-gif:1.9.0, com.squareup.picasso:picasso:2.71828 +android.gradle_dependencies = com.android.support:support-v4:27.1.1, com.android.support:support-media-compat:27.1.1, com.android.support:appcompat-v7:27.1.1, com.facebook.react:react-native:0.59.3, com.google.android.gms:play-services-gcm:11.0.4+, com.facebook.fresco:fresco:1.9.0, com.facebook.fresco:animated-gif:1.9.0, com.squareup.picasso:picasso:2.71828, com.google.firebase:firebase-core:16.0.1 # (str) python-for-android branch to use, defaults to master #p4a.branch = stable diff --git a/buildozer.spec.vagrant b/buildozer.spec.vagrant index cb4aec9d..2a10e128 100644 --- a/buildozer.spec.vagrant +++ b/buildozer.spec.vagrant @@ -148,7 +148,7 @@ android.react_src = ./app # (list) Gradle dependencies to add (currently works only with sdl2_gradle # bootstrap) -android.gradle_dependencies = com.android.support:support-v4:27.1.1, com.android.support:support-media-compat:27.1.1, com.android.support:appcompat-v7:27.1.1, com.facebook.react:react-native:0.59.3, com.mixpanel.android:mixpanel-android:5+, com.google.android.gms:play-services-gcm:11.0.4+, com.facebook.fresco:fresco:1.9.0, com.facebook.fresco:animated-gif:1.9.0, com.squareup.picasso:picasso:2.71828 +android.gradle_dependencies = com.android.support:support-v4:27.1.1, com.android.support:support-media-compat:27.1.1, com.android.support:appcompat-v7:27.1.1, com.facebook.react:react-native:0.59.3, com.google.android.gms:play-services-gcm:11.0.4+, com.facebook.fresco:fresco:1.9.0, com.facebook.fresco:animated-gif:1.9.0, com.squareup.picasso:picasso:2.71828, com.google.firebase:firebase-core:16.0.1 # (str) python-for-android branch to use, defaults to master #p4a.branch = stable diff --git a/p4a/pythonforandroid/bootstraps/lbry/build/build.py b/p4a/pythonforandroid/bootstraps/lbry/build/build.py index 6c64175d..71e5e7c9 100755 --- a/p4a/pythonforandroid/bootstraps/lbry/build/build.py +++ b/p4a/pythonforandroid/bootstraps/lbry/build/build.py @@ -405,10 +405,10 @@ main.py that loads it.''') android_api=android_api, build_tools_version=build_tools_version) - render( - 'settings.tmpl.gradle', - 'settings.gradle' - ) + render('settings.gradle', 'settings.gradle') + + ## google-services.json for firebase + render('google-services.json', 'google-services.json') # copy icon drawables for folder in ('drawable-hdpi', 'drawable-mdpi', 'drawable-xhdpi', 'drawable-xxhdpi', 'drawable-xxxhdpi'): diff --git a/p4a/pythonforandroid/bootstraps/lbry/build/templates/build.tmpl.gradle b/p4a/pythonforandroid/bootstraps/lbry/build/templates/build.tmpl.gradle index 6f739abd..744f259c 100644 --- a/p4a/pythonforandroid/bootstraps/lbry/build/templates/build.tmpl.gradle +++ b/p4a/pythonforandroid/bootstraps/lbry/build/templates/build.tmpl.gradle @@ -6,6 +6,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:3.0.0' + classpath 'com.google.gms:google-services:4.0.1' } } @@ -41,6 +42,11 @@ android { } } + compileOptions { + sourceCompatibility 1.8 + targetCompatibility 1.8 + } + dexOptions { jumboMode true } @@ -107,3 +113,6 @@ dependencies { {%- endfor %} {%- endif %} } + +apply plugin: 'com.google.gms.google-services' +com.google.gms.googleservices.GoogleServicesPlugin.config.disableVersionCheck = true diff --git a/p4a/pythonforandroid/bootstraps/lbry/build/templates/settings.tmpl.gradle b/p4a/pythonforandroid/bootstraps/lbry/build/templates/settings.gradle similarity index 100% rename from p4a/pythonforandroid/bootstraps/lbry/build/templates/settings.tmpl.gradle rename to p4a/pythonforandroid/bootstraps/lbry/build/templates/settings.gradle diff --git a/src/main/java/io/lbry/browser/reactmodules/FirebaseModule.java b/src/main/java/io/lbry/browser/reactmodules/FirebaseModule.java new file mode 100644 index 00000000..7804091d --- /dev/null +++ b/src/main/java/io/lbry/browser/reactmodules/FirebaseModule.java @@ -0,0 +1,80 @@ +package io.lbry.browser.reactmodules; + +import android.content.Context; +import android.os.Bundle; +import android.widget.Toast; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.google.firebase.analytics.FirebaseAnalytics; + +import io.lbry.browser.BuildConfig; + +import java.util.HashMap; +import java.util.Map; +import org.json.JSONObject; +import org.json.JSONException; + +public class FirebaseModule extends ReactContextBaseJavaModule { + + private Context context; + + private FirebaseAnalytics firebaseAnalytics; + + public FirebaseModule(ReactApplicationContext reactContext) { + super(reactContext); + this.context = reactContext; + this.firebaseAnalytics = FirebaseAnalytics.getInstance(context); + } + + @Override + public String getName() { + return "Firebase"; + } + + @ReactMethod + public void track(String name, ReadableMap payload) { + Bundle bundle = new Bundle(); + if (payload != null) { + HashMap payloadMap = payload.toHashMap(); + for (Map.Entry entry : payloadMap.entrySet()) { + Object value = entry.getValue(); + if (value != null) { + bundle.putString(entry.getKey(), entry.getValue().toString()); + } + } + } + + if (firebaseAnalytics != null) { + firebaseAnalytics.logEvent(name, bundle); + } + } + + @ReactMethod + public void logException(boolean fatal, String message, ReadableMap payload) { + Bundle bundle = new Bundle(); + if (payload != null) { + HashMap payloadMap = payload.toHashMap(); + for (Map.Entry entry : payloadMap.entrySet()) { + Object value = entry.getValue(); + if (value != null) { + bundle.putString(entry.getKey(), entry.getValue().toString()); + } + } + } + + if (firebaseAnalytics != null) { + firebaseAnalytics.logEvent(fatal ? "exception" : "warning", bundle); + } + + if (fatal) { + Toast.makeText(context, + "An application error occurred which has been automatically logged. " + + "If you keep seeing this message, please provide feedback to the LBRY " + + "team by emailing hello@lbry.io.", + Toast.LENGTH_LONG).show(); + } + } +} \ No newline at end of file diff --git a/src/main/java/io/lbry/browser/reactmodules/MixpanelModule.java b/src/main/java/io/lbry/browser/reactmodules/MixpanelModule.java deleted file mode 100644 index 57874d14..00000000 --- a/src/main/java/io/lbry/browser/reactmodules/MixpanelModule.java +++ /dev/null @@ -1,87 +0,0 @@ -package io.lbry.browser.reactmodules; - -import android.content.Context; -import android.widget.Toast; - -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; -import com.facebook.react.bridge.ReadableMap; - -import com.mixpanel.android.mpmetrics.MixpanelAPI; - -import io.lbry.browser.BuildConfig; - -import java.util.HashMap; -import java.util.Map; -import org.json.JSONObject; -import org.json.JSONException; - -public class MixpanelModule extends ReactContextBaseJavaModule { - - private static final String MIXPANEL_TOKEN = BuildConfig.DEBUG ? - "bc1630b8be64c5dfaa4700b3a62969f3" /* Dev Testing */ : - "93b81fb957cb0ddcd3198c10853a6a95"; /* Production */ - - private Context context; - - private MixpanelAPI mixpanel; - - public MixpanelModule(ReactApplicationContext reactContext) { - super(reactContext); - this.context = reactContext; - this.mixpanel = MixpanelAPI.getInstance(this.context, MIXPANEL_TOKEN); - } - - @Override - public String getName() { - return "Mixpanel"; - } - - @ReactMethod - public void track(String name, ReadableMap payload) { - JSONObject props = new JSONObject(); - try { - if (payload != null) { - HashMap payloadMap = payload.toHashMap(); - for (Map.Entry entry : payloadMap.entrySet()) { - props.put(entry.getKey(), entry.getValue()); - } - } - } catch (JSONException e) { - // Cannot use props. Stick with empty props. - } - - if (mixpanel != null) { - mixpanel.track(name, props); - } - } - - @ReactMethod - public void logException(boolean fatal, String message, ReadableMap payload) { - JSONObject props = new JSONObject(); - try { - props.put("Message", message); - if (payload != null) { - HashMap payloadMap = payload.toHashMap(); - for (Map.Entry entry : payloadMap.entrySet()) { - props.put(entry.getKey(), entry.getValue()); - } - } - } catch (JSONException e) { - // Cannot use props. Stick with empty props. - } - - if (mixpanel != null) { - mixpanel.track(fatal ? "Exception" : "Warning", props); - } - - if (fatal) { - Toast.makeText(context, - "An application error occurred which has been automatically logged. " + - "If you keep seeing this message, please provide feedback to the LBRY " + - "team by emailing hello@lbry.io.", - Toast.LENGTH_LONG).show(); - } - } -} diff --git a/src/main/java/io/lbry/browser/reactpackages/LbryReactPackage.java b/src/main/java/io/lbry/browser/reactpackages/LbryReactPackage.java index 6ec81d00..fb6862c6 100644 --- a/src/main/java/io/lbry/browser/reactpackages/LbryReactPackage.java +++ b/src/main/java/io/lbry/browser/reactpackages/LbryReactPackage.java @@ -9,7 +9,7 @@ import io.lbry.browser.reactmodules.BackgroundMediaModule; import io.lbry.browser.reactmodules.DaemonServiceControlModule; import io.lbry.browser.reactmodules.DownloadManagerModule; import io.lbry.browser.reactmodules.FirstRunModule; -import io.lbry.browser.reactmodules.MixpanelModule; +import io.lbry.browser.reactmodules.FirebaseModule; import io.lbry.browser.reactmodules.ScreenOrientationModule; import io.lbry.browser.reactmodules.VersionInfoModule; import io.lbry.browser.reactmodules.UtilityModule;; @@ -32,7 +32,7 @@ public class LbryReactPackage implements ReactPackage { modules.add(new DaemonServiceControlModule(reactContext)); modules.add(new DownloadManagerModule(reactContext)); modules.add(new FirstRunModule(reactContext)); - modules.add(new MixpanelModule(reactContext)); + modules.add(new FirebaseModule(reactContext)); modules.add(new ScreenOrientationModule(reactContext)); modules.add(new UtilityModule(reactContext)); modules.add(new VersionInfoModule(reactContext)); -- 2.45.3 From b923fe256a21196bb8a5433dd3b8ea493d6001ac Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 1 May 2019 09:31:23 +0100 Subject: [PATCH 3/4] add encrypted google-services.json file --- lbry-android.keystore.secret | Bin 2736 -> 2737 bytes .../templates/google-services.json.secret | Bin 0 -> 1027 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 p4a/pythonforandroid/bootstraps/lbry/build/templates/google-services.json.secret diff --git a/lbry-android.keystore.secret b/lbry-android.keystore.secret index 3768f7c991b1b014e63663ca7b5df19dd15c1423..c2798b89837b5289b11d4e45911de0be85684936 100644 GIT binary patch literal 2737 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 literal 2736 zcmV;h3QzTg0t^G$jRG(+f;S!k5C2eG3$aD$3z*_R4y4F_0qi06I1BG0&g;>IfXja8 zU18wZoy2qS&y*}P_*rbIaX6XeBJ#oqrdz}eImjTg0<1Xh6&sCJCK0KVIWdG~ppOrF z><=pv{n^GUK*gDfE-pI5^oi?I?h}J-%F@(j;pSQ>ZC_h+2g2A+Uh#s!90@CPDy0@g zP;v9o%gw&w`2dTIx!zTiA6FvB+BgEZ9Sac`K9h(TrC{W*gSQDsmka$b`~hWn_%mnm z+i2kIGql*dapIx~)nRX}DDrB-pE9FmRoV}xNUIdrW>qY{kjR6l4aPg!0mc9ryf|)( z(rvgw@*O`743w8kMRN7l*EdrwhT}~SCmumo;KS^%+>If&k7HI>+BbKEMzmU5xHY>T*OesWcuEZO@?CcCnc`Ikia;k6yGZFLz!yB91ypTic850w(E_+svS6>std-Mf(`49E>$imdHQ`>|PTA z5tV?wNJ!E1nX6D^$9FU_Bt$* z6wiF1Y_D9Y%<}qWV^D!q50||v)F9`d>5=0&fDB9AtUi2PQ_MKo>Cj<}0L1!~ss-kM zM-hZI%T7$EYjKr{8@zX!TuyjN2!gD!j*AI7V*Y?!N#3N6>^%dRsT0PjWwBT$o>mA={ML~EtjX9; zJK7Mk9Bj9-!_@~~r$-7I7gJ_UKOnw7mWU|M@1YHjz*(p2tRm&_iQ&Tg`PR-W=QUL&akvT(+=AuS0W|zYS27aU5*Ar(pNdKEJLFR{nQvtyCMr_CaFt2RTII&FJz?0SKI#Pu(xSEtoVuphBjVJRJD@x+hNGtdThV@5aGhTOcmbMzEC9-rwqSne`&y^9SiMXSj@ zJ9*f%Y9GcM`;oA-A^%JpSSZ^GRpVYEaf8c8z$luh$t5_^_OSfSv%WmKecI=G)QsJ8 z%)!PT$iE_2W!MlS)!^v*KA?-wGN~17ha>dB&6W|_F<4Uc=~tm78`UviGV3I$&`*Jv zFc&}(sh@jrt*a_ZWW(|XRpBLsQOIHu*k=psffqpl*w|UdArt@CkCqt*&xF4e9L?!P zBrtZ~K=STjG`E*NSd%3pjY+gLjSVFznsC)?S>vSL)?tA!r5#LL9s`Bs7=aRP6^REk zi|*Ior6*MhYM3xVnV@#2U1;c8mijM@iRn9$Y+8t?dE~1?g^&kEbR*vMdB{W)otmO^ z==kuUFqK#GsvOrSPiiMWGh#`0)p3R)DVfL?9JeV!-HkSijc8$>Y|T->8g@3H;-BZj z-L&H@W#?jR=lpUrU?dPC)rY_Q9I5AiU%`b z!sj2WrDlIjhZbpk4o{%eg#pE}eH==x$k%Vf-C{DjrUbp?^0!BVP4Y}*q%;p9| zVQTnf-P2h%+FNV&0?J)(PERJ*X`zK4g8c1TrN7rtO+~7vReEa4X|B1HTjd)rUwdUS z_VuuxE|3ZtMr^ge-wXhn-LgKmk&U}q{{oksn?@*|?0ojPCpQPMl{<-J2U1!ihT2Zz zIkcd7U_B_1?=xs}-6`f>hoRMw7+B?O~hFssr>r?uv=*}FsLii>ud z;-_6re#JHj@fqIzADx}w1!`xjZ6oV>ovrD-`|8me@||&=(~=P7|DevA*I5#xPYNRv z>PrnRJi_741_E^({>w=l<-Jq4X_8o)z-omQxD)uD@Ytg2G9C9m zLWB3m=#v78+^0R8Q=D`D2exi05GEZ1ky=V+FLUi+ zhP%9bFoAqZ2yF!c3xnsvepZzIEec<9IG?AjOqhazA!Pqe(vgtC$|#cO*$D$}hPF-o z#qb*Ok7lgO-S{3tF}PAkAjIu0Tiu}aWiYF@j-drdc3A)qy4DRyNXO`-%0iBwTq9D2 qv|YzX^i?|{Ys}=<2f(Bn$CD~``$`KqEQrQw)X(V5z-nu(3=CzsR7CFp diff --git a/p4a/pythonforandroid/bootstraps/lbry/build/templates/google-services.json.secret b/p4a/pythonforandroid/bootstraps/lbry/build/templates/google-services.json.secret new file mode 100644 index 0000000000000000000000000000000000000000..1b211530fccc1cfafc702465b77c4ed56df4d8d4 GIT binary patch literal 1027 zcmV+e1pNDj0t^G$jRG(+f;S!k5B@VW(>7z>eaLjs)Y7rTa8#H+-P~>>ISV#v#Ctq{wnt{RfI=RU~wZM$K6Ufty^SmgToDqCKYcIImS?l9X z)3YhO;o+TDgtEJVE9Kwz4d4a8qg1C!J@hUz6jaabW$rwHWt?h=v4p!~-?h4hUj%Py z(DN*V^Atdp0&q_x@=g#tvtLE}+;25RN!@xrW}=B$t66m%{KIqJ((T0J_CeDpR&k>U z%EII4GxnpFsxAD{*ALF=L9Z!o#Jl7QK7!a?KU|h%WnawAk2{*smG0>eda!O~yG-7z zxTy#}QoA~NyQQMU`!1C@^%ph)dSVD;wvl+EYkBO-o9?={Es;$eq$LmUrfXboy7`b| zP3#*c2y19ClsJ&|N*wSLwxR$kWswetYj2P`ReJxeq1zV zWs)dxMq)I1=(V4NsPX(Qy{>ZxtpaenhT@>X2mgPunF@NjW#|c_A0QjKt#>VFPSge)&Ym!iQ7>@N|L@M!$ESqC&NkQ)112U*9@m@uUp zsQd{PayxPi@a3HJG9iLa=Nzst0C5O3QPTW5Zf834<2jd<_+6A{eujeoB4G7ZdB7J- zIRiO&g0-Y&|wYywJIyVXM;AKD-PySgcG*-CF`*en`reC33VnQt#o% z|7912THCX49At|ou|rN0qN{EYF~oHZ%#W2JlDnOjn$fQ zVILgnw24&d1h9uIG16qodu{8{+0tnjCQR=r5Nk#qaW zPP`JEucVi$Pwl1^Rh^_Z1;Yu3@lW7)xRUVmWi6>neNF@zrljKiz7Rx2GY9{&>7Hu> zC5eVM+`F4+)UMiN=$&>ehvQ~)>R|I$M53BFW$v%qlL^W-p3fK=ti)uf05mSP|CW<~ x?t*T+DgkIux%$vj$nW!IukE|;b8fQt#lgb{_#EEXCixZzvt-#d1Ppj;qL2&<1vLNw literal 0 HcmV?d00001 -- 2.45.3 From 76562fbd07de4b67773dbf982b25cf2f0caef302 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Wed, 1 May 2019 09:40:32 +0100 Subject: [PATCH 4/4] update encrypted google-services.json --- lbry-android.keystore.secret | Bin 2737 -> 2736 bytes .../templates/google-services.json.secret | Bin 1027 -> 1025 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/lbry-android.keystore.secret b/lbry-android.keystore.secret index c2798b89837b5289b11d4e45911de0be85684936..ae36c4be00887bbdc8a015cb49598b0225c8a27e 100644 GIT binary patch literal 2736 zcmV;h3QzTg0t^G$jRG(+f;S!k5CEjJ46L8mDb`qHqIc4TQP)bD%VcoWXVt{N=FA@^ z2!iu;tWF|x)zAfz#jUMBti;VIQ0BV!Tt(tLHNkJV9UW7SGr8(p-}K!0CZmFh9#{1d zX1Q5@ng8dpU?|;DJ<9f7eRW<_zV^Z%}qehaI8{KmfJB zG;;G#qLqt#?o*&X%`he``OY!nzn|qm^Z99fXSWl)Ww2*rdGiA7ZL|A0hQ`RW$I9HB zE7?wFzz&(kcx6}+t4=}&tj)qj#5Ykh7V+z~P9}vG_X75~IfvZJ%0KYVryA>iw!Mij z24u__c)7%?ujaj~;ylyzo``gygl<6rONVpQZj3zmPA$3)oMM!@WA0$EOZhj<+&58O zesoifK&!E?$b0b5gC!E9=7dH5Qdhlr?ZBKXpfW^u+aIG#q#ktEJ6W+CrECpoq6W}Q z!mKfkmv|KnkyZ%WLaPyJS6H}18xAMk79=9`{qTz)4*A)S5OZx!KSBU2wROQty_-H6 zV*@y&>2_6bG3}ar$;h}o;2!!blOpzUE0PoYq;_zmUiLFD^b|*9bW9xu%iacF&k$EuDBs7uSh*_3%3LPCh8Cq;Z zGC;3XK~c4iWN$PsdNGl@WM|;_vP0<2zp72f%T8KV_7x^hz3XRjOB<$1m z6N&=WMHG5*-_o@&Bto?h^Ooq;q^p#FzKdh0Bg}*I0NSeG}!&xRvl>UQGUt>Ud>sc;JYjy?r+XW9#|w zDr{2k6D5vnQM5Ko+)(V|@*AL}>srjcEH7@N zg@Qkr+90y>O#pqv7^*+H5KY;5%yX!;bE6<_tN2b1Vl11Ib8 zHSC$6wc#8OP=KIL8Wl$1m4Fciog;eiTP;_Sy;te8)f53^l~siY{*ogiZL2KOjP(f} z2G41IcbxY!IWA@#;4X=_1tj1jbXes5ZnCM|xPFdls<|}8e3~4+@NILCch73Ae?^I1 zAqK;tzZVM+K!9Ud4@AIu6zQs~0~6_lq*Jn6A_?fMv2NONV`*~Yos`72QOR#Weunly zFQlD!W;Q~18|f?sEfhczZ#dc&TMd?pYnVBL18IFUF(E}?9%Zhm3mIk$w*4$I-D$oN z+rFEhXN*Rex4%JA(k}U1-9|76N*vo`*~MIUMjLKX zoB`_D|K-!Rf2zVWBV>$E{Qk?nftK*Ki3hvhSc&F7$sl(cRTI0y6VlBcl5RyIEHm zECc+Buqs_F2L+?JI@N7OploF}C_k zA+YU1h$F;qYZkr9$?RFyQ@VmC|+bodb{R6D&{uv%%`u0%b_XEFVc7P=JuU1w17%}>EW+v=@>}~NFRg)&?zf#$a zl=))9yRWYuBigXimxuTWiE>%%eh7V&eX>eDWEDpK(1lCHf536^l|*`JsO#kWxaezS%(lCWFuVbQDPpxr{WEg(HbF2IbWr29I9?yoKvxac^RqMCsSxdkH1(i zeke+_#X1Z*ekV$vU_qXx9-%L{r(xTfD%RV5{{+)0X_$LW8F9iOfoCo*_~RZ{K3ndQ z1(U+XqU5Ml?BBa0^rD8d*QoTmYI<4%Tb4OVUUhK9&dWtDLG6NLBxUAd{bApEvf4(c z(l!Y0Eqf-{!m9!MJx`TT#c;a_s^o-=ZrqK^gqfd$ZNd86ddh5Zmfe8ejU0R_T377J z3)d(+;L*?eypp8_&D*m^2&BSSx1cV4n;ZeDK5skiElw3i*(M=T#Tld+m!o;7QKX~B z#i1*x*tgkS6%G%XcQksyWGV2i6<_&1dCjVyuz0yr@^Joha9S^wmn;2O2S^?j`y|~! z5h=*2UcfjnrtiRY7Q_br1=BbZOOk@{$Y0}!gy7PXR9_#i71l<8_m#AWeXxwe!%Iz@ zPuJisnA;8uvOyL>rQ*D1o);Cp)7AZRYdMzM)?1pM#k)^g@4&Hbxl3T50jsNIWTZ{$ zDr5G2$XNk*fsD$`<;?Ug^Rad76-$y?p>g(iDS4X-vu}b17(rY|zR`_4YRb39%=>N9 zhS*39@(1dF=LyQ(RQSpSPLb-0_8TWX#_X(QGBQ0n9I`fX_1>F- z%2(D#Z*Y7U#+n-u(z zRB9qO)YAmfn=2J1$EdpQ!Yct2)_Uq*LTH@foYI#>@9!~_a_oo=3eZBT7Ls??)mx8jHsQs0+QP6wh7}#pjjlApmYSQH*xzPP zEoq$m^oy_(A9P8pos+4TM2>@b&TA)=#e9ys^oK8us92Jxo-8h-Gk`Wu(H6dG6LTzZ zZNJ${Y(#_z%aybm^HuR-~Ba$_0i7t4!#3N#rYUS9Y;tNQfHj!M+P%2J zuvC*h>T*-Qmn#(ea;3zb!8mP_Y~hCJ7~neFpr6>EGMRcY+;x(O0?rJOVjKTQ0f>lL zp9!mO{~{OUKV1Q0T8t5$R&1f_k^|OvM>YXbfnm4B0kJ*eGxkEVkwz%Wv4c^-(=X)w zQ@ZI68~b+x#EEq&@{WqJf$@O3Oh;D8(XY3Ir72HBrRi4ofLr`Xlj%JCbh>JBihe=duF$_L$QHtJTc1aoMo5zrC;U0Fl~2hSt${5J|09}#TiOXY>A z`4Wf8;!*mYpK9sT?AMlk?fn!SbTIEfqc55Gu^T z{*(hvWaSLr4|u9o*j2?G*T_t$Un)m>;-5?#3lDx^@ws;&dvpYveSbPNL7QOZ;#$K1 zuQmSMFN7ml{YC=&%Y@43Y*x_7X67g~(1hZRV59#12oE}(@7U&B!~u?qnrKmlM^L`) zYozkAl4-fLd%vf}R&dhm0ruy_70aaz&WKeQhHtfJBM;Y*NW}r-yxtMwviJ{ba?Gm) z1MLPi^uqAdGylHmM%a`4ou_gw#7hv2&DaMHmDE7P=A&3ahb+3eis%xXziI$@;NZhd z>>K5Kf=E}KFyQ$62!*Bht;TIi3&GswJC_#AQIgY+eY_?9hRA}LY|KIZ=DDlVl!H+Z zqt@dsSkqdA=S&U*`y*dhDA72Cdd}AS{B9X)!%!W)d&%G@)Y;tD0*V9O zRZX}WZGuu(u^UKMcMi@q1tLa56zs&m4roCr@-G<0x(0CyF=uQyD#7ZTx?XG~;5)NtNG&#jjjoF-{?)%3pL2#2NE z%r7PJ9fq}bfU=Mib}@krDqpkEJM4aI>JBLlOrB^F?)I`I;*5TQ=FbsM=gUy zhrtRE{6Wqi3@YhpbEjnK#=vcWzCbpVvT>pf0s5k=E4OZ7QY|DmmdLIo#7Z=SH#OoD8{uJizPOK(6!Eg} zqOoo{s0)65dhKob_GY*~zDO*IGfq{-Z0u+6Y&IoqiC^U6%D+G}FnU7F#-i%kag&xq z%#~6o-~o-aE8WBmQ~ZC!^JBeeD;J($&lx}Gr)>B(>G19J>;l->bwRP``T1WyWNX%U zpJ8^`)69BKI=|!UEXD{olrX&feG;jj92N!@A(5&K#f9X$Sep2O`{lvAoe+;BBe7@( z$hBrwpQRA@@}Q7zzGfcs#T>Dk#12a!$pgjeLNt@$h-sY*qI+Ku;2b^Au0Jc}CSl#= z9?8(5NH(@ebTqRr8$7kXaz=dQ;xwQ-tQbc`0c?23s%!eEnA2&l(TVj>M2DS5)}zr4g+ z5VWWuU`Tuwt{1#k2&W(&0YwoOTLgfCeOWy`PsVBPUjKlL1_=aV6F$;M{ zAhsgCM9XQ}vrCd(B5f<);A<3WTZE?lIP{K^m{!>QFi8=;Om3>GiPR-7E zviQfpkm-T#@E(E4;>UL{vlJf*>Rsou?rF5!WazQqF{t++nGFYVV`Gm2UJ}55)z8ua z9pkOT*&ZZ>lK=$dp<+Op;K!R7WFmp=0VaFTx9w$On7uaFhG+6wGz*7Ms>fJ{+@d2e z_6*odL&kzx&2Wc)ViZu&KI3rGYP@eij}2T*KW8!f#gUh4tae>aWL{Me^(z*|YqSTG zBjWK1M{OENa0%x;s9~F|=Cqc78IWtbvLbT8l}H?%noXul6&w zTmVC$QHt8M5MRbl1b8BfyD#HMCpe1U@{avVlGNS`Vewn#O zdr(_+&Q3#g>`yKDSDlbWXkzhL9A4A=B|5yhpq z9K|bX-Jdlg8G^^Q&pn|YAp@!|BpE&HSpWBsdsA?|Cn$!w>X$pDI|CMQ4L#9@1el$< z&TcvBxC#UALdHFZDi6FW1V$W1$512^CO0z70Q~idOp<)6#Q2bp?>;OC!PuUlJk38Y zl>V0l-VMcDiqV-ImqsaiE=}tDo<_Xz@oh>n&19-~3A>+zvRQ50M zu$yRKB&mL6K=xIYTGyz|2Mnm3F`9%263@p3o;&LYXZb8umCLVneLI1CP0}Q39d)g|%SCB4S;S;Z`-&$6m diff --git a/p4a/pythonforandroid/bootstraps/lbry/build/templates/google-services.json.secret b/p4a/pythonforandroid/bootstraps/lbry/build/templates/google-services.json.secret index 1b211530fccc1cfafc702465b77c4ed56df4d8d4..faf326fb88d467a0452b12a18a197a96aca80f0b 100644 GIT binary patch literal 1025 zcmV+c1pfPl0t^G$jRG(+f;S!k5CFU=KKPm0{+X1fZ;vrPB_+Cz%IMFT?-c7dW}k(q z2-Ti(OKxH+5RPsHEasogl+YD@_7-`{+qkr%q5XblbXZ9IssK6A^kTcZQcN$K-%=ow z8S4eOm@>x}8nSAFZyzGTH_OB}M?Ki{j+FbGh-;Q=i36q4=y+)9^{Lv;X`W+lvOr6@ zrCJIEgrFWhB$K%-q&2vntnULm%b|wo!r&ZV8cIDeF+87AB1uk@eN4`s5{}nn|5Mni zwy()eX>WP4ta(s}*NyB4m?hGn0Ro1QuC1a0+!C0tJi?`w4S(9X)3PLVLoqvi3BJmtjvN&mGbr zet`u&`r7XIiL2vt+=RU-oifMBunQjh1+=u-TX3sfkbSUs@5t3qi6S<3<`P8%LEoUK zR7%smQr`m_;*Y^g^MJpu1&y;|H!0>eXA(D7JWN9T4=&QVdG4Bc?z|tEVGL2i5tI2` zHSXmqJN37-S%NW3-$D|v;TSSKbLUBy%%B_d^?E1moj&3x_x%KEP%22 z4%x?Py(OougYm@IB3Q`h&m;)n8t~+=eYfp~K1nUu$q)&d+RN$eE-9bA8W?r%PuA!4 zex^Q7aRz#7JVgS{U}Sr_>>$bkmjLj*>R6jJT@7Jp_Zl$a)pGti4P%-E z1vNUkkf>Z+^eZ0QBBOl`?;6T&VVNvf3jRBHFoIg|#v^H`L&;=bT-e@az)fvEjSSFi z<_5Y$4f%k|VBtJlH^PiqKMy{xJP=W;HT{h}!VC?X<w535ViVshR0#Tgm-|hpup>>$*F)tH5FIQzTAFRttlLi() zSc=Wi-1M6w4~u@DJN#y58b)iegimn$(F|ub)#??7H%1oE5UAx37CO+i+U_&!-Dx|< zTGapwO_R~Opl=7{X$lMa)RJ?<4SQyWz%I8`_Kh11X0@1L2no<@)FIb(%e`zLy7z>eaLjs)Y7rTa8#H+-P~>>ISV#v#Ctq{wnt{RfI=RU~wZM$K6Ufty^SmgToDqCKYcIImS?l9X z)3YhO;o+TDgtEJVE9Kwz4d4a8qg1C!J@hUz6jaabW$rwHWt?h=v4p!~-?h4hUj%Py z(DN*V^Atdp0&q_x@=g#tvtLE}+;25RN!@xrW}=B$t66m%{KIqJ((T0J_CeDpR&k>U z%EII4GxnpFsxAD{*ALF=L9Z!o#Jl7QK7!a?KU|h%WnawAk2{*smG0>eda!O~yG-7z zxTy#}QoA~NyQQMU`!1C@^%ph)dSVD;wvl+EYkBO-o9?={Es;$eq$LmUrfXboy7`b| zP3#*c2y19ClsJ&|N*wSLwxR$kWswetYj2P`ReJxeq1zV zWs)dxMq)I1=(V4NsPX(Qy{>ZxtpaenhT@>X2mgPunF@NjW#|c_A0QjKt#>VFPSge)&Ym!iQ7>@N|L@M!$ESqC&NkQ)112U*9@m@uUp zsQd{PayxPi@a3HJG9iLa=Nzst0C5O3QPTW5Zf834<2jd<_+6A{eujeoB4G7ZdB7J- zIRiO&g0-Y&|wYywJIyVXM;AKD-PySgcG*-CF`*en`reC33VnQt#o% z|7912THCX49At|ou|rN0qN{EYF~oHZ%#W2JlDnOjn$fQ zVILgnw24&d1h9uIG16qodu{8{+0tnjCQR=r5Nk#qaW zPP`JEucVi$Pwl1^Rh^_Z1;Yu3@lW7)xRUVmWi6>neNF@zrljKiz7Rx2GY9{&>7Hu> zC5eVM+`F4+)UMiN=$&>ehvQ~)>R|I$M53BFW$v%qlL^W-p3fK=ti)uf05mSP|CW<~ x?t*T+DgkIux%$vj$nW!IukE|;b8fQt#lgb{_#EEXCixZzvt-#d1Ppj;qL2&<1vLNw -- 2.45.3