This commit is contained in:
aricloverEXTRA 2026-05-15 23:22:57 -04:00 committed by GitHub
commit 4365e19b6b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 180 additions and 316 deletions

View file

@ -1,3 +1,33 @@
## Lightweight Alternative - YTLite / YTLitePlus
<details>
<summary>Read more</summary><br>
# Switch from uYouEnhanced to either YTLite or YTLitePlus (optional)
Hello, this is here to showcase this tweak. I have been seeing the posts about the YTLitePlus tweak on Reddit for quite some time now and decided to add it here. Before you download or check out the tweak, you should take a look at the pros and cons below to learn more about YTLitePlus.
https://github.com/YTLitePlus/YTLitePlus/releases
**YTLitePlus - Pros**
- YTLitePlus is stable and more customizable than uYouPlus/uYouEnhanced. (same goes for the regular YTLite, it's stable based on my testing of using it)
- YTLitePlus provides more features in YTLite & YTLitePlus Sections in Settings that uYouPlus/uYouEnhanced may not have.
- YTLitePlus includes a lightweight and simplified version of the App Version Spoofer, making it easier to use.
- YTLitePlus does not cause your device to overheat, unlike uYouPlus/uYouEnhanced.
- YTLitePlus provides faster video & audio downloading than uYouPlus/uYouEnhanced.
**YTLitePlus - Cons**
- Video quality on WiFi option is not available in YTLitePlus.
- Reordering the pivot bar tabs such as `Home`, `Shorts`, `Explore`, `Trending`, `Create`, `Subscriptions` & `You` is not available in YTLitePlus.
</details>
## About the future of the uYouEnhanced Project (Updated, June 13, 2025)
Hey everyone,
@ -391,34 +421,3 @@ See [Installation - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Installati
# Wiki
See [arichornlover - Wiki](https://github.com/arichornlover/uYouEnhanced/wiki/) or [qnblackcat - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/)
## Lightweight Alternative - YTLite / YTLitePlus
<details>
<summary>Read more</summary><br>
# Switch from uYouEnhanced to either YTLite or YTLitePlus (optional)
Hello, this is here to showcase this tweak. I have been seeing the posts about the YTLitePlus tweak on Reddit for quite some time now and decided to add it here. Before you download or check out the tweak, you should take a look at the pros and cons below to learn more about YTLitePlus.
https://github.com/YTLitePlus/YTLitePlus/releases
**YTLitePlus - Pros**
- YTLitePlus is stable and more customizable than uYouPlus/uYouEnhanced. (same goes for the regular YTLite, it's stable based on my testing of using it)
- YTLitePlus provides more features in YTLite & YTLitePlus Sections in Settings that uYouPlus/uYouEnhanced may not have.
- YTLitePlus includes a lightweight and simplified version of the App Version Spoofer, making it easier to use.
- YTLitePlus does not cause your device to overheat, unlike uYouPlus/uYouEnhanced.
- YTLitePlus provides faster video & audio downloading than uYouPlus/uYouEnhanced.
**YTLitePlus - Cons**
- Video quality on WiFi option is not available in YTLitePlus.
- Reordering the pivot bar tabs such as `Home`, `Shorts`, `Explore`, `Trending`, `Create`, `Subscriptions` & `You` is not available in YTLitePlus.
</details>

View file

@ -42,13 +42,14 @@
#import <YouTubeHeader/YTIPlayerBarDecorationModel.h>
#import <YouTubeHeader/YTISectionListRenderer.h>
#import <YouTubeHeader/YTIStringRun.h>
#import <YouTubeHeader/YTIWatchNextResponse.h>
#import <YouTubeHeader/YTMainAppVideoPlayerOverlayViewController.h>
#import <YouTubeHeader/YTMainAppVideoPlayerOverlayView.h>
#import <YouTubeHeader/YTNavigationBarTitleView.h>
#import <YouTubeHeader/YTPlayerBarController.h>
#import <YouTubeHeader/YTPlayerBarRectangleDecorationView.h>
#import <YouTubeHeader/YTPlayerOverlay.h>
#import <YouTubeHeader/YTPlayerOverlayProvider.h>
#import <YouTubeHeader/YTPlayerOverlayProvider.h>
#import <YouTubeHeader/QTMIcon.h>
#import <YouTubeHeader/YTReelModel.h>
#import <YouTubeHeader/YTReelWatchPlaybackOverlayView.h>

View file

@ -400,9 +400,7 @@ YTMainAppControlsOverlayView *controlsOverlayView;
%hook YTHotConfig
- (BOOL)disableAfmaIdfaCollection { return NO; }
%end
%hook YTIPlayerResponse
- (BOOL)isMonetized { return NO; }
%new(@@:)
- (NSMutableArray *)playerAdsArray {
return [NSMutableArray array];
@ -458,14 +456,13 @@ YTMainAppControlsOverlayView *controlsOverlayView;
%end
%end
// uYou AdBlock Workaround (Note: disables uYou's "Remove YouTube Ads" Option) - @PoomSmart, @arichornlover & @Dodieboy
// uYou AdBlock Workaround (Note: disables uYou's "Remove YouTube Ads" YouTube-X Option) - @PoomSmart, @arichornlover & @Dodieboy
%group uYouAdBlockingWorkaround
// Workaround: uYou 3.0.3 Adblock fix
%hook YTHotConfig
- (BOOL)disableAfmaIdfaCollection { return NO; }
%end
%hook YTIPlayerResponse
- (BOOL)isMonetized { return NO; }
%new(@@:)
- (NSMutableArray *)playerAdsArray {
return [NSMutableArray array];
@ -524,8 +521,37 @@ YTMainAppControlsOverlayView *controlsOverlayView;
%orig;
}
%end
static BOOL isProductList(YTICommand *command) {
if ([command respondsToSelector:@selector(yt_showEngagementPanelEndpoint)]) {
YTIShowEngagementPanelEndpoint *endpoint = [command yt_showEngagementPanelEndpoint];
return [endpoint.identifier.tag isEqualToString:@"PAproduct_list"];
}
return NO;
}
%hook YTWatchNextResponseViewController
- (void)loadWithModel:(YTIWatchNextResponse *)model {
YTICommand *onUiReady = model.onUiReady;
if ([onUiReady respondsToSelector:@selector(yt_commandExecutorCommand)]) {
YTICommandExecutorCommand *commandExecutorCommand = [onUiReady yt_commandExecutorCommand];
NSMutableArray <YTICommand *> *commandsArray = commandExecutorCommand.commandsArray;
[commandsArray removeObjectsAtIndexes:[commandsArray indexesOfObjectsPassingTest:^BOOL(YTICommand *command, NSUInteger idx, BOOL *stop) {
return isProductList(command);
}]];
}
if (isProductList(onUiReady))
model.onUiReady = nil;
%orig;
}
%end
%hook YTMainAppVideoPlayerOverlayViewController
- (void)playerOverlayProvider:(YTPlayerOverlayProvider *)provider didInsertPlayerOverlay:(YTPlayerOverlay *)overlay {
if ([[overlay overlayIdentifier] isEqualToString:@"player_overlay_product_in_video"]) return;
%orig;
}
%end
NSString *getAdString(NSString *description) {
for (NSString *str in @[ @"brand_promo",
for (NSString *str in @[
@"brand_promo",
@"carousel_footered_layout",
@"carousel_headered_layout",
@"eml.expandable_metadata",
@ -545,9 +571,8 @@ NSString *getAdString(NSString *description) {
@"text_search_ad",
@"video_display_full_layout",
@"video_display_full_buttoned_layout"
])
])
if ([description containsString:str]) return str;
return nil;
}
static BOOL isAdRenderer(YTIElementRenderer *elementRenderer, int kind) {

View file

@ -1,20 +1,39 @@
#import "uYouPlusPatches.h"
#define YT_BUNDLE_ID @"com.google.ios.youtube"
#define YT_NAME @"YouTube"
# pragma mark - YouTube patches
// Fix Google Sign in Patch
%group gGoogleSignInPatch
%hook NSBundle
+ (NSBundle *)bundleWithIdentifier:(NSString *)identifier {
if ([identifier isEqualToString:YT_BUNDLE_ID])
return NSBundle.mainBundle;
return %orig(identifier);
}
- (NSString *)bundleIdentifier {
return [self isEqual:NSBundle.mainBundle] ? YT_BUNDLE_ID : %orig;
}
- (NSDictionary *)infoDictionary {
NSDictionary *orig = %orig;
if ([self isEqual:NSBundle.mainBundle]) {
NSMutableDictionary *patched = [orig mutableCopy];
if (patched) {
patched[@"CFBundleIdentifier"] = @"com.google.ios.youtube";
return [patched copy];
}
}
return orig;
NSDictionary *dict = %orig;
if (![self isEqual:NSBundle.mainBundle])
return %orig;
NSMutableDictionary *info = [dict mutableCopy];
if (info[@"CFBundleIdentifier"]) info[@"CFBundleIdentifier"] = YT_BUNDLE_ID;
if (info[@"CFBundleDisplayName"]) info[@"CFBundleDisplayName"] = YT_NAME;
if (info[@"CFBundleName"]) info[@"CFBundleName"] = YT_NAME;
return info;
}
- (id)objectForInfoDictionaryKey:(NSString *)key {
if (![self isEqual:NSBundle.mainBundle])
return %orig;
if ([key isEqualToString:@"CFBundleIdentifier"])
return YT_BUNDLE_ID;
if ([key isEqualToString:@"CFBundleDisplayName"] || [key isEqualToString:@"CFBundleName"])
return YT_NAME;
return %orig;
}
%end
%end

View file

@ -732,91 +732,31 @@ NSString *cacheDescription = [NSString stringWithFormat:@"%@", GetCacheSize()];
case 40: return @"v20.25.4";
case 41: return @"v20.24.5";
case 42: return @"v20.24.4";
case 43: return @"v20.23.3";
case 44: return @"v20.22.1";
case 45: return @"v20.21.6";
case 46: return @"v20.20.7";
case 47: return @"v20.20.5";
case 48: return @"v20.19.3";
case 49: return @"v20.19.2";
case 50: return @"v20.18.5";
case 51: return @"v20.18.4";
case 52: return @"v20.16.7";
case 53: return @"v20.15.1";
case 54: return @"v20.14.2";
case 55: return @"v20.13.5";
case 56: return @"v20.12.4";
case 57: return @"v20.11.6";
case 58: return @"v20.10.4";
case 59: return @"v20.10.3";
case 60: return @"v20.09.3";
case 61: return @"v20.08.3";
case 62: return @"v20.07.6";
case 63: return @"v20.06.03";
case 64: return @"v20.05.4";
case 65: return @"v20.03.1";
case 66: return @"v20.03.02";
case 67: return @"v20.02.3";
case 68: return @"v19.49.7";
case 69: return @"v19.49.5";
case 70: return @"v19.49.3";
case 71: return @"v19.47.7";
case 72: return @"v19.46.3";
case 73: return @"v19.45.4";
case 74: return @"v19.44.4";
case 75: return @"v19.43.2";
case 76: return @"v19.42.1";
case 77: return @"v19.41.3";
case 78: return @"v19.40.4";
case 79: return @"v19.39.1";
case 80: return @"v19.38.2";
case 81: return @"v19.37.2";
case 82: return @"v19.36.1";
case 83: return @"v19.35.3";
case 84: return @"v19.34.2";
case 85: return @"v19.33.2";
case 86: return @"v19.32.8";
case 87: return @"v19.32.6";
case 88: return @"v19.31.4";
case 89: return @"v19.30.2";
case 90: return @"v19.29.1";
case 91: return @"v19.28.1";
case 92: return @"v19.26.5";
case 93: return @"v19.25.4";
case 94: return @"v19.25.3";
case 95: return @"v19.24.3";
case 96: return @"v19.24.2";
case 97: return @"v19.23.3";
case 98: return @"v19.22.6";
case 99: return @"v19.22.3";
case 100: return @"v19.21.3";
case 101: return @"v19.21.2";
case 102: return @"v19.20.2 (Deprecated)";
case 103: return @"v19.19.7 (Deprecated)";
case 104: return @"v19.19.5 (Deprecated)";
case 105: return @"v19.18.2 (Deprecated)";
case 106: return @"v19.17.2 (Deprecated)";
case 107: return @"v19.16.3 (Deprecated)";
case 108: return @"v19.15.1 (Deprecated)";
case 109: return @"v19.14.3 (Deprecated)";
case 110: return @"v19.14.2 (Deprecated)";
case 111: return @"v19.13.1 (Deprecated)";
case 112: return @"v19.12.3 (Deprecated)";
case 113: return @"v19.10.7 (Deprecated)";
case 114: return @"v19.10.6 (Deprecated)";
case 115: return @"v19.10.5 (Deprecated)";
case 116: return @"v19.09.4 (Deprecated)";
case 117: return @"v19.09.3 (Deprecated)";
case 118: return @"v19.08.2 (Deprecated)";
case 119: return @"v19.07.5 (Deprecated)";
case 120: return @"v19.07.4 (Deprecated)";
case 121: return @"v19.06.2 (Deprecated)";
case 122: return @"v19.05.5 (Deprecated)";
case 123: return @"v19.05.3 (Deprecated)";
case 124: return @"v19.04.3 (Deprecated)";
case 125: return @"v19.03.2 (Deprecated)";
case 126: return @"v19.02.1 (Deprecated)";
case 127: return @"v19.01.1 (Deprecated)";
case 43: return @"v20.23.3 (Deprecated)";
case 44: return @"v20.22.1 (Deprecated)";
case 45: return @"v20.21.6 (Deprecated)";
case 46: return @"v20.20.7 (Deprecated)";
case 47: return @"v20.20.5 (Deprecated)";
case 48: return @"v20.19.3 (Deprecated)";
case 49: return @"v20.19.2 (Deprecated)";
case 50: return @"v20.18.5 (Deprecated)";
case 51: return @"v20.18.4 (Deprecated)";
case 52: return @"v20.16.7 (Deprecated)";
case 53: return @"v20.15.1 (Deprecated)";
case 54: return @"v20.14.2 (Deprecated)";
case 55: return @"v20.13.5 (Deprecated)";
case 56: return @"v20.12.4 (Deprecated)";
case 57: return @"v20.11.6 (Deprecated)";
case 58: return @"v20.10.4 (Deprecated)";
case 59: return @"v20.10.3 (Deprecated)";
case 60: return @"v20.09.3 (Deprecated)";
case 61: return @"v20.08.3 (Deprecated)";
case 62: return @"v20.07.6 (Deprecated)";
case 63: return @"v20.06.03 (Deprecated)";
case 64: return @"v20.05.4 (Deprecated)";
case 65: return @"v20.03.1 (Deprecated)";
case 66: return @"v20.03.02 (Deprecated)";
case 67: return @"v20.02.3 (Deprecated)";
default: return @"v21.08.3";
}
}
@ -865,91 +805,31 @@ NSString *cacheDescription = [NSString stringWithFormat:@"%@", GetCacheSize()];
SPOOFER_VERSION(@"v20.25.4", 40),
SPOOFER_VERSION(@"v20.24.5", 41),
SPOOFER_VERSION(@"v20.24.4", 42),
SPOOFER_VERSION(@"v20.23.3", 43),
SPOOFER_VERSION(@"v20.22.1", 44),
SPOOFER_VERSION(@"v20.21.6", 45),
SPOOFER_VERSION(@"v20.20.7", 46),
SPOOFER_VERSION(@"v20.20.5", 47),
SPOOFER_VERSION(@"v20.19.3", 48),
SPOOFER_VERSION(@"v20.19.2", 49),
SPOOFER_VERSION(@"v20.18.5", 50),
SPOOFER_VERSION(@"v20.18.4", 51),
SPOOFER_VERSION(@"v20.16.7", 52),
SPOOFER_VERSION(@"v20.15.1", 53),
SPOOFER_VERSION(@"v20.14.2", 54),
SPOOFER_VERSION(@"v20.13.5", 55),
SPOOFER_VERSION(@"v20.12.4", 56),
SPOOFER_VERSION(@"v20.11.6", 57),
SPOOFER_VERSION(@"v20.10.4", 58),
SPOOFER_VERSION(@"v20.10.3", 59),
SPOOFER_VERSION(@"v20.09.3", 60),
SPOOFER_VERSION(@"v20.08.3", 61),
SPOOFER_VERSION(@"v20.07.6", 62),
SPOOFER_VERSION(@"v20.06.03", 63),
SPOOFER_VERSION(@"v20.05.4", 64),
SPOOFER_VERSION(@"v20.03.1", 65),
SPOOFER_VERSION(@"v20.03.02", 66),
SPOOFER_VERSION(@"v20.02.3", 67),
SPOOFER_VERSION(@"v19.49.7", 68),
SPOOFER_VERSION(@"v19.49.5", 69),
SPOOFER_VERSION(@"v19.49.3", 70),
SPOOFER_VERSION(@"v19.47.7", 71),
SPOOFER_VERSION(@"v19.46.3", 72),
SPOOFER_VERSION(@"v19.45.4", 73),
SPOOFER_VERSION(@"v19.44.4", 74),
SPOOFER_VERSION(@"v19.43.2", 75),
SPOOFER_VERSION(@"v19.42.1", 76),
SPOOFER_VERSION(@"v19.41.3", 77),
SPOOFER_VERSION(@"v19.40.4", 78),
SPOOFER_VERSION(@"v19.39.1", 79),
SPOOFER_VERSION(@"v19.38.2", 80),
SPOOFER_VERSION(@"v19.37.2", 81),
SPOOFER_VERSION(@"v19.36.1", 82),
SPOOFER_VERSION(@"v19.35.3", 83),
SPOOFER_VERSION(@"v19.34.2", 84),
SPOOFER_VERSION(@"v19.33.2", 85),
SPOOFER_VERSION(@"v19.32.8", 86),
SPOOFER_VERSION(@"v19.32.6", 87),
SPOOFER_VERSION(@"v19.31.4", 88),
SPOOFER_VERSION(@"v19.30.2", 89),
SPOOFER_VERSION(@"v19.29.1", 90),
SPOOFER_VERSION(@"v19.28.1", 91),
SPOOFER_VERSION(@"v19.26.5", 92),
SPOOFER_VERSION(@"v19.25.4", 93),
SPOOFER_VERSION(@"v19.25.3", 94),
SPOOFER_VERSION(@"v19.24.3", 95),
SPOOFER_VERSION(@"v19.24.2", 96),
SPOOFER_VERSION(@"v19.23.3", 97),
SPOOFER_VERSION(@"v19.22.6", 98),
SPOOFER_VERSION(@"v19.22.3", 99),
SPOOFER_VERSION(@"v19.21.3", 100),
SPOOFER_VERSION(@"v19.21.2", 101),
SPOOFER_VERSION(@"v19.20.2 (Deprecated)", 102),
SPOOFER_VERSION(@"v19.19.7 (Deprecated)", 103),
SPOOFER_VERSION(@"v19.19.5 (Deprecated)", 104),
SPOOFER_VERSION(@"v19.18.2 (Deprecated)", 105),
SPOOFER_VERSION(@"v19.17.2 (Deprecated)", 106),
SPOOFER_VERSION(@"v19.16.3 (Deprecated)", 107),
SPOOFER_VERSION(@"v19.15.1 (Deprecated)", 108),
SPOOFER_VERSION(@"v19.14.3 (Deprecated)", 109),
SPOOFER_VERSION(@"v19.14.2 (Deprecated)", 110),
SPOOFER_VERSION(@"v19.13.1 (Deprecated)", 111),
SPOOFER_VERSION(@"v19.12.3 (Deprecated)", 112),
SPOOFER_VERSION(@"v19.10.7 (Deprecated)", 113),
SPOOFER_VERSION(@"v19.10.6 (Deprecated)", 114),
SPOOFER_VERSION(@"v19.10.5 (Deprecated)", 115),
SPOOFER_VERSION(@"v19.09.4 (Deprecated)", 116),
SPOOFER_VERSION(@"v19.09.3 (Deprecated)", 117),
SPOOFER_VERSION(@"v19.08.2 (Deprecated)", 118),
SPOOFER_VERSION(@"v19.07.5 (Deprecated)", 119),
SPOOFER_VERSION(@"v19.07.4 (Deprecated)", 120),
SPOOFER_VERSION(@"v19.06.2 (Deprecated)", 121),
SPOOFER_VERSION(@"v19.05.5 (Deprecated)", 122),
SPOOFER_VERSION(@"v19.05.3 (Deprecated)", 123),
SPOOFER_VERSION(@"v19.04.3 (Deprecated)", 124),
SPOOFER_VERSION(@"v19.03.2 (Deprecated)", 125),
SPOOFER_VERSION(@"v19.02.1 (Deprecated)", 126),
SPOOFER_VERSION(@"v19.01.1 (Deprecated)", 127)
SPOOFER_VERSION(@"v20.23.3 (Deprecated)", 43),
SPOOFER_VERSION(@"v20.22.1 (Deprecated)", 44),
SPOOFER_VERSION(@"v20.21.6 (Deprecated)", 45),
SPOOFER_VERSION(@"v20.20.7 (Deprecated)", 46),
SPOOFER_VERSION(@"v20.20.5 (Deprecated)", 47),
SPOOFER_VERSION(@"v20.19.3 (Deprecated)", 48),
SPOOFER_VERSION(@"v20.19.2 (Deprecated)", 49),
SPOOFER_VERSION(@"v20.18.5 (Deprecated)", 50),
SPOOFER_VERSION(@"v20.18.4 (Deprecated)", 51),
SPOOFER_VERSION(@"v20.16.7 (Deprecated)", 52),
SPOOFER_VERSION(@"v20.15.1 (Deprecated)", 53),
SPOOFER_VERSION(@"v20.14.2 (Deprecated)", 54),
SPOOFER_VERSION(@"v20.13.5 (Deprecated)", 55),
SPOOFER_VERSION(@"v20.12.4 (Deprecated)", 56),
SPOOFER_VERSION(@"v20.11.6 (Deprecated)", 57),
SPOOFER_VERSION(@"v20.10.4 (Deprecated)", 58),
SPOOFER_VERSION(@"v20.10.3 (Deprecated)", 59),
SPOOFER_VERSION(@"v20.09.3 (Deprecated)", 60),
SPOOFER_VERSION(@"v20.08.3 (Deprecated)", 61),
SPOOFER_VERSION(@"v20.07.6 (Deprecated)", 62),
SPOOFER_VERSION(@"v20.06.03 (Deprecated)", 63),
SPOOFER_VERSION(@"v20.05.4 (Deprecated)", 64),
SPOOFER_VERSION(@"v20.03.1 (Deprecated)", 65),
SPOOFER_VERSION(@"v20.03.02 (Deprecated)", 66),
SPOOFER_VERSION(@"v20.02.3 (Deprecated)", 67)
];
YTSettingsPickerViewController *picker = [[%c(YTSettingsPickerViewController) alloc] initWithNavTitle:LOC(@"VERSION_SPOOFER_SELECTOR") pickerSectionTitle:nil rows:rows selectedItemIndex:appVersionSpoofer() parentResponder:[self parentResponder]];
[settingsViewController pushViewController:picker];

View file

@ -49,91 +49,31 @@ static VersionMapping versionMappings[] = {
{40, @"20.25.4"},
{41, @"20.24.5"},
{42, @"20.24.4"},
{43, @"20.23.3"},
{44, @"20.22.1"},
{45, @"20.21.6"},
{46, @"20.20.7"},
{47, @"20.20.5"},
{48, @"20.19.3"},
{49, @"20.19.2"},
{50, @"20.18.5"},
{51, @"20.18.4"},
{52, @"20.16.7"},
{53, @"20.15.1"},
{54, @"20.14.2"},
{55, @"20.13.5"},
{56, @"20.12.4"},
{57, @"20.11.6"},
{58, @"20.10.4"},
{59, @"20.10.3"},
{60, @"20.09.3"},
{61, @"20.08.3"},
{62, @"20.07.6"},
{63, @"20.06.03"},
{64, @"20.05.4"},
{65, @"20.03.1"},
{66, @"20.03.02"},
{67, @"20.02.3"},
{68, @"19.49.7"},
{69, @"19.49.5"},
{70, @"19.49.3"},
{71, @"19.47.7"},
{72, @"19.46.3"},
{73, @"19.45.4"},
{74, @"19.44.4"},
{75, @"19.43.2"},
{76, @"19.42.1"},
{77, @"19.41.3"},
{78, @"19.40.4"},
{79, @"19.39.1"},
{80, @"19.38.2"},
{81, @"19.37.2"},
{82, @"19.36.1"},
{83, @"19.35.3"},
{84, @"19.34.2"},
{85, @"19.33.2"},
{86, @"19.32.8"},
{87, @"19.32.6"},
{88, @"19.31.4"},
{89, @"19.30.2"},
{90, @"19.29.1"},
{91, @"19.28.1"},
{92, @"19.26.5"},
{93, @"19.25.4"},
{94, @"19.25.3"},
{95, @"19.24.3"},
{96, @"19.24.2"},
{97, @"19.23.3"},
{98, @"19.22.6"},
{99, @"19.22.3"},
{100, @"19.21.3"},
{101, @"19.21.2"},
{102, @"19.20.2"},
{103, @"19.19.7"},
{104, @"19.19.5"},
{105, @"19.18.2"},
{106, @"19.17.2"},
{107, @"19.16.3"},
{108, @"19.15.1"},
{109, @"19.14.3"},
{110, @"19.14.2"},
{111, @"19.13.1"},
{112, @"19.12.3"},
{113, @"19.10.7"},
{114, @"19.10.6"},
{115, @"19.10.5"},
{116, @"19.09.4"},
{117, @"19.09.3"},
{118, @"19.08.2"},
{119, @"19.07.5"},
{120, @"19.07.4"},
{121, @"19.06.2"},
{122, @"19.05.5"},
{123, @"19.05.3"},
{124, @"19.04.3"},
{125, @"19.03.2"},
{126, @"19.02.1"},
{127, @"19.01.1"}
{43, @"20.23.3 (Deprecated)"},
{44, @"20.22.1 (Deprecated)"},
{45, @"20.21.6 (Deprecated)"},
{46, @"20.20.7 (Deprecated)"},
{47, @"20.20.5 (Deprecated)"},
{48, @"20.19.3 (Deprecated)"},
{49, @"20.19.2 (Deprecated)"},
{50, @"20.18.5 (Deprecated)"},
{51, @"20.18.4 (Deprecated)"},
{52, @"20.16.7 (Deprecated)"},
{53, @"20.15.1 (Deprecated)"},
{54, @"20.14.2 (Deprecated)"},
{55, @"20.13.5 (Deprecated)"},
{56, @"20.12.4 (Deprecated)"},
{57, @"20.11.6 (Deprecated)"},
{58, @"20.10.4 (Deprecated)"},
{59, @"20.10.3 (Deprecated)"},
{60, @"20.09.3 (Deprecated)"},
{61, @"20.08.3 (Deprecated)"},
{62, @"20.07.6 (Deprecated)"},
{63, @"20.06.03 (Deprecated)"},
{64, @"20.05.4 (Deprecated)"},
{65, @"20.03.1 (Deprecated)"},
{66, @"20.03.02 (Deprecated)"},
{67, @"20.02.3 (Deprecated)"}
};
static int appVersionSpoofer() {

@ -1 +1 @@
Subproject commit 6cd5adc700cd79de80f7b02d0d14f1e5a7ea64aa
Subproject commit 3cdf53b3a23653b87c3c9e96ffdba0f359a77f4d

@ -1 +1 @@
Subproject commit fd3d7a569aa01477f28b49f0f98b58ae9d48d3b3
Subproject commit ec2f82a87e9d157d53dbc38cb9f05df955ce3acd

@ -1 +1 @@
Subproject commit f799b70cb40e32de6ba779529ad60ecd8f601cfd
Subproject commit 28da1b91b7fdc62d5e486e4fa568f297ad606704

@ -1 +1 @@
Subproject commit f428a716021fd3e389e0ada5f05b3f215e079e24
Subproject commit 644e5ecaed5b69a3d97a0de9dceadea1a3319690

@ -1 +1 @@
Subproject commit 852a58dc2c53d1426557b25ac0ca53570338248b
Subproject commit 4469be2398298c5a372bf345c1fbb7fcd8277cf8

@ -1 +1 @@
Subproject commit 899a2fdd539ae308e5847bbb3d7212cfce30a3a6
Subproject commit 43c39ccfba454e0f602c39524b173a97f5cd774a

@ -1 +1 @@
Subproject commit 8d6726e569a194d3f1c1ae973b290c66301087f1
Subproject commit f756b6b3423b65152094020471720cfc9a3932d2

@ -1 +1 @@
Subproject commit 49ece8b0fac8465ee4fd8bf0b54790106e50cb88
Subproject commit c39c288ca58a526f89068e3af0d548782e8c2780

@ -1 +1 @@
Subproject commit d56dccd4336f0902f05813f4af177360c69fe33f
Subproject commit 3199d594bbec58f419107fc7b1d9c28f209bcd04

@ -1 +1 @@
Subproject commit cbd7e9daf765ecf5d9ceb27afac15cc3eec3ecc0
Subproject commit 5034aec7384c6f4082dc9a45fd51aa63f3c7ac16

@ -1 +1 @@
Subproject commit 79b9ed44958ad27fe75ee14ccc300aa99610c263
Subproject commit b232dfa9ed70b66db81a2c68693b5dd7837538c5

@ -1 +1 @@
Subproject commit e0f97ef5fe47c5c3728ce2ff7a6fb02bc085e86b
Subproject commit c8b7b54de204cfd34bac28afa494138b30ee788e

@ -1 +1 @@
Subproject commit 57093a8bd5cb44211f323519a0045b883475666f
Subproject commit a37dbd643372b05de834190941671a1563d7e499