Skip to content

Commit

Permalink
Cherry pick changes for 10.10.0-rc.1 release (#1740)
Browse files Browse the repository at this point in the history
* Remove 10s delay as CoreTelemetry does not freeze main thread (#1699)

* Update generated code to use latest spec (#1696)

* Add missing changelog entry (#1707)

* Update generated code (#1708)

* Flush telemetry on MapView deinit (#1700)

* Refactoring to use EventsManager init over shared
* Add explicit flush on EventsManager deinit (happens on MapView deinit as well)
* Send map.load event with queued priority
* Some unit tests refactoring

* Add iPhone XR iOS 12 to the test device list (#1715)

* Expand cluster example to show additional functionality  (#1713)

* Expand example to include zooming on cluster click

* Add documentation details

* Fix language support and label localization  (#1687)

* Change tests to correct expectations, modify implementation

* Pull in Nav changes

* Port localization approach from nav

* Address PR feedback

* Expand test coverage

* Respond to review, enable passing system Locale

* Add additional tests

* Clean up implementation, add additional tests

* Add changelog entry

* Update changelog

* Use Test Plans for Examples target to avoid unit tests on CI (#1716)

Adding two test plans:
- The default includes Examples tests along with UI tests and Maps unit tests
- The second test plan ignores unit tests to support running tests on devices (SPM unit tests doesn't have a host app so cannot be run on iOS devices)
Fixes for Changelog broken URLs

* Support iOS 12 for location permission dialog workaround (#1719)

* Support iOS 12 for location permission dialog workaround
* Rewrite Accept location UI test in favor of buttons awaitance

* Resolve Hans handling on v7 (#1720)

* Begin migration to test plans, split unit and integration tests (#1714)

* Begin migration to test plans, split unit and integration tests

* Add workspace

* Move over additional schemes

* Update Debugapp TestPlan

* Update directories

* Undo example changes

* A few test plan fixes

Co-authored-by: Roman Gardukevich <roman.gardukevich@mapbox.com>

* Update test checklist item (#1724)

* sync swift version (#1726)

* Update Swift version in podspec

* Update swift version in SPM

* Run unit tests on multiple supported iOS versions (#1718)

* Bump ci latest Xcode executor to `14.1.0` (#1729)

* Update CI xcode image to 14.1

* Fix testplans issue

* Update iPhone destination

* Force test plan

* Bump MapboxCoreMaps to 10.10.0-rc.1 and MapboxCommon to 23.2.0-rc.2 (#1727)

* Minor setup fixes (#1730)

* Update Xcode build settins recommendation base

* Fix a few warnings in unit tests

* Reduce number of base-job uses

* Use large machine for build-sdk job

* Do not build tests on MapboxMaps

* Revert "Use large machine for build-sdk job"

This reverts commit 0e29027.

* DIsable testability

* Stop building DebugApp in build-sdk job

* Add explicit dependency installation steps

* Skip dependencies for some jobs

* Extract install dependencies commands

* Rename some dependency commands

* Update google cloud SDK

* More skip dependencies

* Support custom repository URL based on CircleCI values

* Install python deps for release build jobs

* Use ssh for integration validation (#1731)

* Reenable Codecov (#1666)

* Add Codecov uploader
* Store coverage report

* Upload code coverage to internal service (#1734)

* Drop commented coverage rule from Makefile

* Upload coverage to internal service

* Return slack message report on unit test failure in main branch

* Rename xcodebuild log

* Improve CI job naming

* Enable codecov/patch check

* Install s3 credentials

* Force enable codecov/patch and remove unused flags

* Collect unit and integration tests coverage separately (#1736)

* Test unit tests and integrations tests separately
* Disable parallel testing to fix empty JUnit report
* Enable English language by default
* Parallelize tests in All test plan
* Parallelize tests in IntegrationTests plan

* Allow simultaneous recognition of map- and annotation- handling gesture recognizers (#1737)

* Bump MapboxCommon to 23.2.0-rc.3 (#1738)

* Bump SDK version to 10.10.0-rc.1 (#1739)

Co-authored-by: Roman Gardukevich <roman.gardukevich@mapbox.com>
Co-authored-by: Mai Mai <mai.mai@mapbox.com>
Co-authored-by: Patrick Leonard <pjleonard37@users.noreply.github.com>
  • Loading branch information
4 people authored Nov 18, 2022
1 parent 04c8a08 commit e6269d6
Show file tree
Hide file tree
Showing 62 changed files with 1,935 additions and 509 deletions.
362 changes: 276 additions & 86 deletions .circleci/config.yml

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions .fastlane/Fastfile
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ platform :ios do
scheme: 'Examples', # XCTest scheme
clean: true, # Recommended: This would ensure the build would not include unnecessary files
configuration: "Release",
testplan: "Examples no unit tests",
xcargs: "ENABLE_TESTABILITY=YES SWIFT_TREAT_WARNINGS_AS_ERRORS=NO COMPILER_INDEX_STORE_ENABLE=NO",
skip_detect_devices: true, # Required
build_for_testing: true, # Required
Expand Down
3 changes: 2 additions & 1 deletion .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ Describe the changes in this PR here.
or
| <video src="" width = 250/> | <video src="" width = 250/> |
-->
- [ ] Write tests for all new functionality. If tests were not written, please explain why.
- [ ] Write tests for all new functionality. Put tests in correct [Test Plan](https://github.com/mapbox/mapbox-maps-ios/tree/main/Tests/TestPlans) (Unit, Integration, All)
- [ ] If tests were not written, please explain why.
- [ ] Add documentation comments for any added or updated public APIs.
- [ ] Add any new public, top-level symbols to the Jazzy config's `custom_categories` (scripts/doc-generation/.jazzy.yaml)
- [ ] Add a changelog entry to to bottom of the relevant section (typically the `## main` heading near the top).
Expand Down
25 changes: 14 additions & 11 deletions .swiftpm/xcode/xcshareddata/xcschemes/MapboxMaps.xcscheme
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1340"
LastUpgradeVersion = "1410"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
Expand All @@ -9,7 +9,7 @@
<ExecutionAction
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
<ActionContent
title = "Run Script"
title = "Inject Tests/MapboxMapsTests/Helpers/MapboxAccessToken "
scriptText = "TOKEN_FILE=~/.mapbox&#10;TOKEN_FILE_2=~/mapbox&#10;TOKEN=&quot;$(cat $TOKEN_FILE 2&gt;/dev/null || cat $TOKEN_FILE_2 2&gt;/dev/null)&quot;&#10;if [ &quot;$TOKEN&quot; ]; then&#10; echo &quot;Build pre-action step using ${TOKEN:0:5}&quot;&#10; if [ $(basename &quot;$WORKSPACE_PATH&quot;) = &quot;package.xcworkspace&quot; ]; then&#10; MBX_ROOT=$(echo &quot;$WORKSPACE_PATH&quot; | rev | cut -d&apos;/&apos; -f4- | rev)&#10; elif [ $(basename &quot;$WORKSPACE_PATH&quot;) = &quot;Apps.xcworkspace&quot; ]; then&#10; MBX_ROOT=$(echo &quot;$WORKSPACE_PATH&quot; | rev | cut -d&apos;/&apos; -f3- | rev) &#10; else&#10; exit 1 # Unknown workspace&#10; fi&#10; echo $TOKEN &gt; &quot;$MBX_ROOT/Tests/MapboxMapsTests/Helpers/MapboxAccessToken&quot;&#10;else&#10; echo &quot;Build pre-action step: Could not find access token&quot;&#10;fi&#10;">
<EnvironmentBuildable>
<BuildableReference
Expand Down Expand Up @@ -89,15 +89,18 @@
shouldUseLaunchSchemeArgsEnv = "YES"
enableAddressSanitizer = "YES"
enableASanStackUseAfterReturn = "YES">
<PreActions>
<ExecutionAction
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
<ActionContent
title = "Run Script"
scriptText = "echo &quot;Test pre-action script&quot;&#10;">
</ActionContent>
</ExecutionAction>
</PreActions>
<TestPlans>
<TestPlanReference
reference = "container:Tests/TestPlans/MapboxMapsAll.xctestplan"
default = "YES">
</TestPlanReference>
<TestPlanReference
reference = "container:Tests/TestPlans/UnitTests.xctestplan">
</TestPlanReference>
<TestPlanReference
reference = "container:Tests/TestPlans/IntegrationTests.xctestplan">
</TestPlanReference>
</TestPlans>
<Testables>
<TestableReference
skipped = "NO">
Expand Down
8 changes: 4 additions & 4 deletions Apps/Apps.xcworkspace/xcshareddata/swiftpm/Package.resolved
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,17 @@
"repositoryURL": "https://github.com/mapbox/mapbox-common-ios.git",
"state": {
"branch": null,
"revision": "3f170b36659c6e499a6b2079f661a76ce7596b08",
"version": "23.2.0-beta.1"
"revision": "9c387749d705972ffadb5ed60376cc3688f9d61b",
"version": "23.2.0-rc.3"
}
},
{
"package": "MapboxCoreMaps",
"repositoryURL": "https://github.com/mapbox/mapbox-core-maps-ios.git",
"state": {
"branch": null,
"revision": "d84784c95dfc5081ddab63759acc2b089321f60b",
"version": "10.10.0-beta.1"
"revision": "120770014441b34327c6edda9f3be56183f7dc25",
"version": "10.10.0-rc.1"
}
},
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1340"
LastUpgradeVersion = "1410"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "NO"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
Expand Down Expand Up @@ -41,8 +41,12 @@
isEnabled = "YES">
</AdditionalOption>
</AdditionalOptions>
<Testables>
</Testables>
<TestPlans>
<TestPlanReference
reference = "container:../../Tests/TestPlans/DebugApp.xctestplan"
default = "YES">
</TestPlanReference>
</TestPlans>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
Expand Down
3 changes: 2 additions & 1 deletion Apps/Examples/Examples.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -573,7 +573,7 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1200;
LastUpgradeCheck = 1340;
LastUpgradeCheck = 1410;
TargetAttributes = {
077C4EE9252F7E88007636F1 = {
CreatedOnToolsVersion = 12.0;
Expand Down Expand Up @@ -652,6 +652,7 @@
/* Begin PBXShellScriptBuildPhase section */
0746C187252FB153001638BD /* Insert Mapbox access token */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1340"
version = "1.3">
LastUpgradeVersion = "1410"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
Expand Down Expand Up @@ -29,6 +29,15 @@
shouldUseLaunchSchemeArgsEnv = "YES"
enableAddressSanitizer = "YES"
enableASanStackUseAfterReturn = "YES">
<TestPlans>
<TestPlanReference
reference = "container:../../Tests/TestPlans/Examples.xctestplan"
default = "YES">
</TestPlanReference>
<TestPlanReference
reference = "container:../../Tests/TestPlans/Examples no unit tests.xctestplan">
</TestPlanReference>
</TestPlans>
<Testables>
<TestableReference
skipped = "NO">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import MapboxMaps
class PointAnnotationClusteringExample: UIViewController, ExampleProtocol {

internal var mapView: MapView!
let clusterLayerID = "fireHydrantClusters"

override public func viewDidLoad() {
super.viewDidLoad()
Expand All @@ -18,6 +19,9 @@ class PointAnnotationClusteringExample: UIViewController, ExampleProtocol {

view.addSubview(mapView)

// Add an additional target to the single tap gesture recognizer for when users click on a cluster
mapView.gestures.singleTapGestureRecognizer.addTarget(self, action: #selector(handleTap(gestureRecognizer:)))

// Add the source and style layers once the map has loaded.
mapView.mapboxMap.onNext(event: .mapLoaded) { _ in
self.addPointAnnotations()
Expand Down Expand Up @@ -103,12 +107,54 @@ class PointAnnotationClusteringExample: UIViewController, ExampleProtocol {
}),
clusterRadius: 75,
clusterProperties: clusterProperty)
let pointAnnotationManager = mapView.annotations.makePointAnnotationManager(clusterOptions: clusterOptions)
let pointAnnotationManager = mapView.annotations.makePointAnnotationManager(id: clusterLayerID, clusterOptions: clusterOptions)
pointAnnotationManager.annotations = annotations
pointAnnotationManager.delegate = self

// Additional properties on the text and circle layers can be modified like this below
// To modify the text layer use: "mapbox-iOS-cluster-text-layer-manager-" and SymbolLayer.self
do {
try mapView.mapboxMap.style.updateLayer(withId: "mapbox-iOS-cluster-circle-layer-manager-" + clusterLayerID, type: CircleLayer.self) { layer in
layer.circleStrokeColor = .constant(StyleColor(.black))
layer.circleStrokeWidth = .constant(3)
}
} catch {
print("Updating the layer failed: \(error.localizedDescription)")
}

finish()
}

// When a user taps on a point, query if it is a cluster.
// If it is a cluster get the center and zoom level it expands at
// then move the camera there
@objc func handleTap(gestureRecognizer: UITapGestureRecognizer) {
let point = gestureRecognizer.location(in: mapView)

mapView.mapboxMap.queryRenderedFeatures(with: point,
options: RenderedQueryOptions(layerIds: ["mapbox-iOS-cluster-circle-layer-manager-" + clusterLayerID],
filter: nil)) { [weak self] result in
switch result {
case .success(let queriedFeatures):
if let cluster = queriedFeatures.first?.feature,
let sourceID = self?.clusterLayerID,
case let .point(clusterCenter) = cluster.geometry {
self?.mapView.mapboxMap.getGeoJsonClusterExpansionZoom(forSourceId: sourceID, feature: cluster) { result in
switch result {
case .success(let zoomLevel):
let cameraOptions = CameraOptions(center: clusterCenter.coordinates, zoom: zoomLevel.value as? CGFloat)
self?.mapView.camera.ease(to: cameraOptions, duration: 1)
case .failure(let error):
print("An error occurred: \(error.localizedDescription). Please try another cluster.")
}
}
}
case .failure(let error):
print("An error occurred: \(error.localizedDescription). Please try another cluster.")
}
}
}

// Load GeoJSON file from local bundle and decode into a `FeatureCollection`.
func decodeGeoJSON(from fileName: String) throws -> FeatureCollection? {
guard let path = Bundle.main.path(forResource: fileName, ofType: "geojson") else {
Expand All @@ -125,3 +171,10 @@ class PointAnnotationClusteringExample: UIViewController, ExampleProtocol {
return featureCollection
}
}

// Print out annotation details when a user selects a non-clustered annotation
extension PointAnnotationClusteringExample: AnnotationInteractionDelegate {
func annotationManager(_ manager: MapboxMaps.AnnotationManager, didDetectTappedAnnotations annotations: [MapboxMaps.Annotation]) {
print("AnnotationManager did detect tapped annotations: \(annotations)")
}
}
8 changes: 8 additions & 0 deletions Apps/Examples/Examples/All Examples/LocalizationExample.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@ public class LocalizationExample: UIViewController, ExampleProtocol {
message: "Please select a language to localize to.",
preferredStyle: .actionSheet)

alert.addAction(UIAlertAction(title: "Device Locale", style: .default, handler: { [weak self] _ in
do {
try self?.mapView.mapboxMap.style.localizeLabels(into: Locale.current)
} catch {
print(error)
}
}))

alert.addAction(UIAlertAction(title: "Spanish", style: .default, handler: { [weak self] _ in
try! self?.mapView.mapboxMap.style.localizeLabels(into: Locale(identifier: "es"))
}))
Expand Down
40 changes: 19 additions & 21 deletions Apps/Examples/ExamplesUITests/ExamplesUITests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,32 +18,13 @@ final class ExamplesUITests: XCTestCase {
let app = XCUIApplication()
app.launch()

let locationPermissionGrantedExpectation = expectation(description: "Location permission granted")
locationAuthorizationAlertMonitor = addUIInterruptionMonitor(withDescription: "", handler: { alert in
let allowButton = alert.buttons["Allow While Using App"]

guard allowButton.exists else {
XCTFail("Can't find the allow button")
return false
}
locationPermissionGrantedExpectation.fulfill()
allowButton.tap()
return true
})

// Navigate to an example that should trigger location permissoon alert to be shown
let searchField = app.navigationBars.firstMatch.searchFields.firstMatch
let searchField = app.searchFields.firstMatch
searchField.tap()
searchField.typeText("Location")
app.tables.firstMatch.cells.firstMatch.tap()

// wait for the alert to appear
sleep(2)

// interact with the app so that UI interruption monitor gets triggered
app.swipeUp()

wait(for: [locationPermissionGrantedExpectation], timeout: 5)
acceptLocationPermissionAlert(timeout: 5)
}

func testEveryExample() throws {
Expand All @@ -60,3 +41,20 @@ final class ExamplesUITests: XCTestCase {
}
}
}

extension XCTestCase {
/// Query SpringBoard for alerts and wait for `Allow` or `Allow While Using App` button
func acceptLocationPermissionAlert(timeout: TimeInterval) {
let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")

let predicate = NSPredicate(format: "%K IN %@", #keyPath(XCUIElementAttributes.label), [
"Allow", // pre-iOS 13
"Allow While Using App" // iOS13+
])
let allowButton = springboard.alerts.firstMatch.buttons.matching(predicate).firstMatch

XCTAssertTrue(allowButton.waitForExistence(timeout: timeout), "Can't find the allow button")

allowButton.tap()
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1340"
version = "1.3">
LastUpgradeVersion = "1410"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
Expand All @@ -27,6 +27,12 @@
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<TestPlans>
<TestPlanReference
reference = "container:../../Tests/TestPlans/StressTest.xctestplan"
default = "YES">
</TestPlanReference>
</TestPlans>
<Testables>
<TestableReference
skipped = "NO">
Expand Down
12 changes: 8 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@

Mapbox welcomes participation and contributions from everyone.

## main
## 10.10.0-rc.1 - November 18, 2022

* Fix memory leak when viewport is being deallocated while transition is running. ([#1691](https://github.com/mapbox/mapbox-maps-ios/pull/1691))
* Fix issue with simultaneous recognition of tap gesture. ([#1712](https://github.com/mapbox/mapbox-maps-ios/pull/1712))
* Fix label localization to properly handle Simplified and Traditional Chinese. ([#1687](https://github.com/mapbox/mapbox-maps-ios/pull/1687))
* Allow simultaneous recognition of map- and annotation- handling gesture recognizers. ([#1737](https://github.com/mapbox/mapbox-maps-ios/pull/1737))
* Update MapboxCommon to `v23.2.0-rc.3`. ([#1738](https://github.com/mapbox/mapbox-maps-ios/pull/1738))

## 10.10.0-beta-1 - November 4, 2022
## 10.10.0-beta.1 - November 4, 2022

* Animates to camera that fit a list of view annotations. ([#1634](https://github.com/mapbox/mapbox-maps-ios/pull/1634))
* Prevent view annotation being shown erroneously after options update.([#1627](https://github.com/mapbox/mapbox-maps-ios/pull/1627))
Expand All @@ -17,11 +20,12 @@ Mapbox welcomes participation and contributions from everyone.
* Expose the list of added view annotations. ([#1621](https://github.com/mapbox/mapbox-maps-ios/pull/1621))
* Fix `loadStyleURI/loadStyleJSON` completion being invoked more than once. ([#1665](https://github.com/mapbox/mapbox-maps-ios/pull/1665))
* Remove ornament position deprecation. ([#1676](https://github.com/mapbox/mapbox-maps-ios/pull/1676))
* Prevent map from being rendered on background. By aligning better with Scene lifecycle API, as well as, respecting scene/application activation status, rendering artifacts should no longer be an issue after app is coming from background. ([#1675])(https://github.com/mapbox/mapbox-maps-ios/pull/1675))
* Prevent map from being rendered on background. By aligning better with Scene lifecycle API, as well as, respecting scene/application activation status, rendering artifacts should no longer be an issue after app is coming from background. ([#1675](https://github.com/mapbox/mapbox-maps-ios/pull/1675))
* Support `isDraggable` and `isSelected` properties for annotations. ([#1659](https://github.com/mapbox/mapbox-maps-ios/pull/1659))
* New API to load custom style JSON on the initilization of MapView. ([#1686](https://github.com/mapbox/mapbox-maps-ios/pull/1686))
* Update MapboxCoreMaps to `v10.10.0-beta.1` and MapboxCommon to `v23.2.0-beta.1`. ([#1680](https://github.com/mapbox/mapbox-maps-ios/pull/1680))
* Add API to enable/disable render of world copies. ([#1684](https://github.com/mapbox/mapbox-maps-ios/pull/1684))
* Avoid triggering assertion for the 3D puck layer when returning `allLayerIdentifiers`. ([#1650](https://github.com/mapbox/mapbox-maps-ios/pull/1650))

## 10.9.0 - October 19, 2022

Expand Down Expand Up @@ -201,7 +205,7 @@ Mapbox welcomes participation and contributions from everyone.
* Prevent rendering in background by pausing/resuming display link in response to application or scene lifecycle events. ([#1086](https://github.com/mapbox/mapbox-maps-ios/pull/1086))
* Sync viewport and puck animations. ([#1090](https://github.com/mapbox/mapbox-maps-ios/pull/1090))
* Add puckBearingEnabled property for location. ([#1107](https://github.com/mapbox/mapbox-maps-ios/pull/1107))
* Fix camera change events being fired after map has stopped moving. ([#1118])(https://github.com/mapbox/mapbox-maps-ios/pull/1118))
* Fix camera change events being fired after map has stopped moving. ([#1118](https://github.com/mapbox/mapbox-maps-ios/pull/1118))
* Fix issue where single tap and double tap to zoom in gestures could recognize simultaneously. ([#1113](https://github.com/mapbox/mapbox-maps-ios/pull/1113))
* Remove experimental GestureOptions.pinchBehavior property. ([#1125](https://github.com/mapbox/mapbox-maps-ios/pull/1125))
* Update to MapboxCoreMaps 10.4.0-beta.1 and MapboxCommon 21.2.0-beta.1. ([#1126](https://github.com/mapbox/mapbox-maps-ios/pull/1126))
Expand Down
Loading

0 comments on commit e6269d6

Please sign in to comment.