Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor automatic update flow to use custom Sparkle user driver #3274

Open
wants to merge 59 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
f384c27
Display Fire window downloads per Fire Window (#3250)
mallexxx Oct 18, 2024
3ae0e16
fix grey space and copy (#3432)
SabrinaTardio Oct 23, 2024
eb9eb44
Revert "Resolving automatic update edge cases (#3142)"
quanganhdo Sep 3, 2024
16c8971
UpdateUserDriver draft
quanganhdo Sep 3, 2024
0b90f6b
Refactor UpdateState to show progress
quanganhdo Sep 3, 2024
ee244be
Fix wrong deferInstallation param
quanganhdo Sep 4, 2024
91cf329
Show update progress
quanganhdo Sep 4, 2024
8d69203
Add manual restart
quanganhdo Sep 4, 2024
af2fd57
Rename delegate methods
quanganhdo Sep 4, 2024
7fa88b3
Remove AppRestarter
quanganhdo Sep 4, 2024
100a367
Fix updateCycleDone state
quanganhdo Sep 4, 2024
ea6abac
Remove shouldShowManualUpdateDialog
quanganhdo Sep 4, 2024
0b7b168
Simplify the states (double check needed)
quanganhdo Sep 4, 2024
18c53f0
Add more logging, tweak last check date
quanganhdo Sep 4, 2024
3c1d134
Refactor updateCycleDone state
quanganhdo Sep 4, 2024
3509d82
Move from delegate method to Combine
quanganhdo Sep 4, 2024
d917782
Put popup on hold till update cycle is done
quanganhdo Sep 4, 2024
5a98741
Reconfigure updater whenever setting changes
quanganhdo Sep 4, 2024
e0cea62
Refactor updateProgress
quanganhdo Sep 5, 2024
2d8f569
Minor refactoring
quanganhdo Sep 5, 2024
2cf2ae3
Reintroduce cached result
quanganhdo Sep 5, 2024
b8fd0a4
Refactor new version check for UI
quanganhdo Sep 5, 2024
b6bcdf5
Fix overaggressive updater reconfiguration
quanganhdo Sep 5, 2024
8c27679
Fix release note tab state
quanganhdo Sep 5, 2024
72f395b
Different checkpoints for different update options
quanganhdo Sep 6, 2024
c949cd5
Remove unnecessary code
quanganhdo Sep 6, 2024
926874e
Disable update mode switching if session is in progress
quanganhdo Sep 9, 2024
e5936b7
Rename isNewVersionAvailable to hasPendingUpdate and fix edge case wh…
quanganhdo Sep 9, 2024
aac36c0
Fix stuck hasPendingStatus
quanganhdo Sep 9, 2024
5fda6dc
Check for update upon starting the app
quanganhdo Sep 9, 2024
855e2d8
Simplify user driver
quanganhdo Sep 9, 2024
a0dbbad
Dot goes away when menu opens
quanganhdo Sep 10, 2024
3b23423
Add setNeedsDisplay
quanganhdo Sep 10, 2024
5c50aa1
Add shouldShowUpdateNotification logic
quanganhdo Sep 10, 2024
b8dee18
Check for update when release note / about page is loaded and when it…
quanganhdo Sep 10, 2024
b1a5a13
Fix stuck state when switching between modes
quanganhdo Sep 11, 2024
e2ec0fd
Add DEBUG check
quanganhdo Sep 11, 2024
63d03b3
Avoid overlapping popup
quanganhdo Sep 12, 2024
1e47060
Code cleanup
quanganhdo Sep 12, 2024
b803114
Update copy
quanganhdo Sep 13, 2024
85bac5f
Fix last checked date showing - when idling
quanganhdo Sep 13, 2024
9ddd883
Revert "Increase build number (to be reverted)" and update appcast2 U…
quanganhdo Sep 13, 2024
3ffbeea
Oops, wrong URL
quanganhdo Sep 13, 2024
5e4b840
Revert browserRestart behaviour and undo debug changes
quanganhdo Sep 13, 2024
0c7f2e6
Fix swiftlint
quanganhdo Sep 13, 2024
8a89636
Add missing SPARKLE checks
quanganhdo Sep 16, 2024
ca19821
Design improvements to automatic update flow (#3344)
quanganhdo Oct 7, 2024
7fe501a
Connect refactored update flow to the new release notes page
quanganhdo Oct 16, 2024
c9563d2
Show latest update info
quanganhdo Oct 16, 2024
91a32e8
Pass automaticUpdate to CSS
quanganhdo Oct 17, 2024
e3b2677
Check for update more often
quanganhdo Oct 17, 2024
c22ab35
Fix wrong status
quanganhdo Oct 24, 2024
254662f
Update BSK
quanganhdo Oct 24, 2024
5e71747
Reverted botched rebase
quanganhdo Oct 24, 2024
810f47f
Fix indentation
quanganhdo Oct 24, 2024
b650882
Update icons & copy (#3461)
quanganhdo Oct 29, 2024
fcfef66
Update BSK
quanganhdo Oct 29, 2024
ded664d
Change updates log to default instead of debug
quanganhdo Oct 29, 2024
c7f6dd5
Merge branch 'main' into anh/refactor/sparkle-user-driver
quanganhdo Oct 30, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 6 additions & 16 deletions DuckDuckGo.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,6 @@
1D01A3D92B88DF8B00FE8150 /* PreferencesSyncView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D01A3D72B88DF8B00FE8150 /* PreferencesSyncView.swift */; };
1D02633628D8A9A9005CBB41 /* BWEncryption.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D02633528D8A9A9005CBB41 /* BWEncryption.m */; settings = {COMPILER_FLAGS = "-Wno-deprecated -Wno-strict-prototypes"; }; };
1D074B272909A433006E4AC3 /* PasswordManagerCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D074B262909A433006E4AC3 /* PasswordManagerCoordinator.swift */; };
1D0DE93E2C3BA9840037ABC2 /* AppRestarter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0DE93D2C3BA9840037ABC2 /* AppRestarter.swift */; };
1D0DE93F2C3BA9840037ABC2 /* AppRestarter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0DE93D2C3BA9840037ABC2 /* AppRestarter.swift */; };
1D0DE9412C3BB9CC0037ABC2 /* ReleaseNotesParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0DE9402C3BB9CC0037ABC2 /* ReleaseNotesParser.swift */; };
1D0DE9422C3BB9CC0037ABC2 /* ReleaseNotesParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0DE9402C3BB9CC0037ABC2 /* ReleaseNotesParser.swift */; };
1D12F2E2298BC660009A65FD /* InternalUserDeciderStoreMock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D12F2E1298BC660009A65FD /* InternalUserDeciderStoreMock.swift */; };
Expand All @@ -69,8 +67,6 @@
1D220BF92B86192200F8BBC6 /* PreferencesEmailProtectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D220BF72B86192200F8BBC6 /* PreferencesEmailProtectionView.swift */; };
1D220BFC2B87AACF00F8BBC6 /* PrivacyProtectionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D220BFB2B87AACF00F8BBC6 /* PrivacyProtectionStatus.swift */; };
1D220BFD2B87AACF00F8BBC6 /* PrivacyProtectionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D220BFB2B87AACF00F8BBC6 /* PrivacyProtectionStatus.swift */; };
1D232E942C7860DA0043840D /* BinaryOwnershipChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D232E932C7860DA0043840D /* BinaryOwnershipChecker.swift */; };
1D232E992C7870D90043840D /* BinaryOwnershipCheckerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D232E962C786E7D0043840D /* BinaryOwnershipCheckerTests.swift */; };
1D26EBAC2B74BECB0002A93F /* NSImageSendable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D26EBAB2B74BECB0002A93F /* NSImageSendable.swift */; };
1D26EBAD2B74BECB0002A93F /* NSImageSendable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D26EBAB2B74BECB0002A93F /* NSImageSendable.swift */; };
1D26EBB02B74DB600002A93F /* TabSnapshotCleanupService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D26EBAF2B74DB600002A93F /* TabSnapshotCleanupService.swift */; };
Expand Down Expand Up @@ -2762,6 +2758,7 @@
BD384ACA2BBC821A00EF3735 /* vpn-light-mode.json in Resources */ = {isa = PBXBuildFile; fileRef = BD384AC72BBC821100EF3735 /* vpn-light-mode.json */; };
BD384ACB2BBC821B00EF3735 /* vpn-dark-mode.json in Resources */ = {isa = PBXBuildFile; fileRef = BD384AC82BBC821100EF3735 /* vpn-dark-mode.json */; };
BD384ACC2BBC821B00EF3735 /* vpn-light-mode.json in Resources */ = {isa = PBXBuildFile; fileRef = BD384AC72BBC821100EF3735 /* vpn-light-mode.json */; };
BD6367252C877BE1009DE7A8 /* UpdateUserDriver.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD6367242C877BE1009DE7A8 /* UpdateUserDriver.swift */; };
BD7090CF2C5182FB009EED82 /* UnifiedFeedbackFormView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7090CE2C5182FB009EED82 /* UnifiedFeedbackFormView.swift */; };
BD7090D02C5182FB009EED82 /* UnifiedFeedbackFormView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7090CE2C5182FB009EED82 /* UnifiedFeedbackFormView.swift */; };
BD7090D22C52ECFE009EED82 /* UnifiedMetadataCollector.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD7090D12C52ECFE009EED82 /* UnifiedMetadataCollector.swift */; };
Expand Down Expand Up @@ -3296,16 +3293,13 @@
1D02633428D8A9A9005CBB41 /* BWEncryption.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BWEncryption.h; sourceTree = "<group>"; };
1D02633528D8A9A9005CBB41 /* BWEncryption.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BWEncryption.m; sourceTree = "<group>"; };
1D074B262909A433006E4AC3 /* PasswordManagerCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordManagerCoordinator.swift; sourceTree = "<group>"; };
1D0DE93D2C3BA9840037ABC2 /* AppRestarter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppRestarter.swift; sourceTree = "<group>"; };
1D0DE9402C3BB9CC0037ABC2 /* ReleaseNotesParser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReleaseNotesParser.swift; sourceTree = "<group>"; };
1D12F2E1298BC660009A65FD /* InternalUserDeciderStoreMock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalUserDeciderStoreMock.swift; sourceTree = "<group>"; };
1D1A33482A6FEB170080ACED /* BurnerMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BurnerMode.swift; sourceTree = "<group>"; };
1D1C36E229FAE8DA001FA40C /* FaviconManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaviconManagerTests.swift; sourceTree = "<group>"; };
1D1C36E529FB019C001FA40C /* HistoryTabExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryTabExtensionTests.swift; sourceTree = "<group>"; };
1D220BF72B86192200F8BBC6 /* PreferencesEmailProtectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesEmailProtectionView.swift; sourceTree = "<group>"; };
1D220BFB2B87AACF00F8BBC6 /* PrivacyProtectionStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyProtectionStatus.swift; sourceTree = "<group>"; };
1D232E932C7860DA0043840D /* BinaryOwnershipChecker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BinaryOwnershipChecker.swift; sourceTree = "<group>"; };
1D232E962C786E7D0043840D /* BinaryOwnershipCheckerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BinaryOwnershipCheckerTests.swift; sourceTree = "<group>"; };
1D26EBAB2B74BECB0002A93F /* NSImageSendable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSImageSendable.swift; sourceTree = "<group>"; };
1D26EBAF2B74DB600002A93F /* TabSnapshotCleanupService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabSnapshotCleanupService.swift; sourceTree = "<group>"; };
1D36E657298AA3BA00AA485D /* InternalUserDeciderStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalUserDeciderStore.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -4657,6 +4651,7 @@
BBFF355C2C4AF26200DA3289 /* BookmarksSortModeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksSortModeTests.swift; sourceTree = "<group>"; };
BD384AC72BBC821100EF3735 /* vpn-light-mode.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "vpn-light-mode.json"; sourceTree = "<group>"; };
BD384AC82BBC821100EF3735 /* vpn-dark-mode.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "vpn-dark-mode.json"; sourceTree = "<group>"; };
BD6367242C877BE1009DE7A8 /* UpdateUserDriver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateUserDriver.swift; sourceTree = "<group>"; };
BD7090CE2C5182FB009EED82 /* UnifiedFeedbackFormView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnifiedFeedbackFormView.swift; sourceTree = "<group>"; };
BD7090D12C52ECFE009EED82 /* UnifiedMetadataCollector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnifiedMetadataCollector.swift; sourceTree = "<group>"; };
BD7090D52C540D5D009EED82 /* EmptyMetadataCollector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyMetadataCollector.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -5229,12 +5224,11 @@
1DA84D312C119AE70011C80F /* UpdateMenuItemFactory.swift */,
1D72D59B2BFF61B200AEDE36 /* UpdateNotificationPresenter.swift */,
1D9297BE2C1B062900A38521 /* ApplicationUpdateDetector.swift */,
1D0DE93D2C3BA9840037ABC2 /* AppRestarter.swift */,
1D232E932C7860DA0043840D /* BinaryOwnershipChecker.swift */,
1D39E5762C2BFD5700757339 /* ReleaseNotesTabExtension.swift */,
1D39E5792C2C0F3700757339 /* ReleaseNotesUserScript.swift */,
1D0DE9402C3BB9CC0037ABC2 /* ReleaseNotesParser.swift */,
1D710F4A2C48F1F200C3975F /* UpdateDialogHelper.swift */,
BD6367242C877BE1009DE7A8 /* UpdateUserDriver.swift */,
);
path = Updates;
sourceTree = "<group>";
Expand Down Expand Up @@ -5271,7 +5265,6 @@
children = (
1D838A312C44F0180078373F /* ReleaseNotesParserTests.swift */,
1D638D602C44F2BA00530DD5 /* ApplicationUpdateDetectorTests.swift */,
1D232E962C786E7D0043840D /* BinaryOwnershipCheckerTests.swift */,
);
path = Updates;
sourceTree = "<group>";
Expand Down Expand Up @@ -11714,7 +11707,6 @@
3707C71E294B5D2900682A9F /* URLRequestExtension.swift in Sources */,
3706FCA3293F65D500E42796 /* WKProcessPool+GeolocationProvider.swift in Sources */,
372A0FED2B2379310033BF7F /* SyncMetricsEventsHandler.swift in Sources */,
1D0DE93F2C3BA9840037ABC2 /* AppRestarter.swift in Sources */,
3706FCA4293F65D500E42796 /* RecentlyClosedMenu.swift in Sources */,
8400DC4C2C6E26AE006509D2 /* ItemCachingCollectionView.swift in Sources */,
4B9DB02D2A983B24000927DB /* WaitlistKeychainStorage.swift in Sources */,
Expand Down Expand Up @@ -12636,7 +12628,6 @@
B6BF5D8929470BC4006742B1 /* HTTPSUpgradeTabExtension.swift in Sources */,
1D36E65B298ACD2900AA485D /* AppIconChanger.swift in Sources */,
4B4D60E22A0C883A00BCD287 /* AppMain.swift in Sources */,
1D0DE93E2C3BA9840037ABC2 /* AppRestarter.swift in Sources */,
7BCB90C22C18626E008E3543 /* VPNControllerXPCClient+ConvenienceInitializers.swift in Sources */,
4B9DB0202A983B24000927DB /* ProductWaitlistRequest.swift in Sources */,
7B60B0022C5145EC008E32A3 /* VPNUIActionHandler.swift in Sources */,
Expand Down Expand Up @@ -13156,7 +13147,6 @@
37BF3F21286F0A7A00BD9014 /* PinnedTabsViewModel.swift in Sources */,
EEC4A6692B2C87D300F7C0AA /* VPNLocationView.swift in Sources */,
AAC5E4D225D6A709007F5990 /* BookmarkList.swift in Sources */,
1D232E942C7860DA0043840D /* BinaryOwnershipChecker.swift in Sources */,
B602E81D2A1E25B1006D261F /* NEOnDemandRuleExtension.swift in Sources */,
56A0543E2C215FB3007D8FAB /* OnboardingUserScript.swift in Sources */,
C1372EF42BBC5BAD003F8793 /* SecureTextField.swift in Sources */,
Expand Down Expand Up @@ -13185,6 +13175,7 @@
37219B3A2CBFD4F300C9D7A8 /* NewTabPageSearchBoxExperiment+Logger.swift in Sources */,
37AAA41C2C9CB9C0002A5377 /* AddressBarTextFieldView.swift in Sources */,
AA6820EB25503D6A005ED0D5 /* Fire.swift in Sources */,
BD6367252C877BE1009DE7A8 /* UpdateUserDriver.swift in Sources */,
3158B1492B0BF73000AF130C /* DBPHomeViewController.swift in Sources */,
9F56CFA92B82DC4300BB7F11 /* AddEditBookmarkFolderView.swift in Sources */,
37445F9C2A1569F00029F789 /* SyncBookmarksAdapter.swift in Sources */,
Expand Down Expand Up @@ -13504,7 +13495,6 @@
567A23E12C89B1EE0010F66C /* BrowserTabViewControllerOnboardingTests.swift in Sources */,
986189E62A7CFB3E001B4519 /* LocalBookmarkStoreSavingTests.swift in Sources */,
AA652CD325DDA6E9009059CC /* LocalBookmarkManagerTests.swift in Sources */,
1D232E992C7870D90043840D /* BinaryOwnershipCheckerTests.swift in Sources */,
CBDD5DE329A67F2700832877 /* MockConfigurationStore.swift in Sources */,
9F3910692B68D87B00CB5112 /* ProgressExtensionTests.swift in Sources */,
560C6ED02CCA5C6000D411E2 /* CapturingOnboardingNavigationDelegate.swift in Sources */,
Expand Down Expand Up @@ -14675,8 +14665,8 @@
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/duckduckgo/BrowserServicesKit";
requirement = {
kind = exactVersion;
version = 201.0.0;
kind = revision;
revision = 8f0f19bcaccf60a7bbc4166f363b4ddca6aa10b7;
};
};
9FF521422BAA8FF300B9819B /* XCRemoteSwiftPackageReference "lottie-spm" */ = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,15 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/duckduckgo/BrowserServicesKit",
"state" : {
"revision" : "e5946eee6af859690cc1cc5e51daef3c8368981b",
"version" : "201.0.0"
"revision" : "8f0f19bcaccf60a7bbc4166f363b4ddca6aa10b7"
}
},
{
"identity" : "content-scope-scripts",
"kind" : "remoteSourceControl",
"location" : "https://github.com/duckduckgo/content-scope-scripts",
"state" : {
"revision" : "b74549bd869fdecc16fad851f2f608b1724764df",
"version" : "6.25.0"
"revision" : "f4b1e50b4719de107dfd7dd6c46899f7f11d659a"
}
},
{
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions DuckDuckGo/Assets.xcassets/Images/Check.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Check-Color-16.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "Icon 22.pdf",
"filename" : "Exclamation-High-Color-16.svg",
"idiom" : "universal"
}
],
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "Document-Color-16.pdf",
"filename" : "Release-Notes-Color-16.svg",
"idiom" : "universal"
}
],
Expand Down
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "Icon 19.pdf",
"filename" : "Exclamation-Color-16-2.svg",
"idiom" : "universal"
}
],
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Loading