fastlane 2.140.0 → 2.141.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +81 -68
- data/cert/lib/cert/options.rb +12 -5
- data/cert/lib/cert/runner.rb +13 -0
- data/deliver/lib/deliver/options.rb +2 -2
- data/deliver/lib/deliver/runner.rb +13 -2
- data/fastlane/lib/fastlane/actions/build_app.rb +157 -6
- data/fastlane/lib/fastlane/actions/build_ios_app.rb +28 -132
- data/fastlane/lib/fastlane/actions/build_mac_app.rb +46 -0
- data/fastlane/lib/fastlane/actions/create_pull_request.rb +29 -0
- data/fastlane/lib/fastlane/actions/docs/{build_ios_app.md → build_app.md} +1 -1
- data/fastlane/lib/fastlane/actions/gym.rb +3 -7
- data/fastlane/lib/fastlane/actions/import_from_git.rb +4 -0
- data/fastlane/lib/fastlane/actions/set_github_release.rb +1 -1
- data/fastlane/lib/fastlane/actions/update_plist.rb +37 -2
- data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +1 -0
- data/fastlane/lib/fastlane/fast_file.rb +13 -3
- data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +2 -0
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/DeliverfileProtocol.swift +3 -3
- data/fastlane/swift/Fastlane.swift +239 -35
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/GymfileProtocol.swift +17 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/MatchfileProtocol.swift +7 -3
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +5 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane/swift/SnapshotfileProtocol.swift +9 -1
- data/fastlane_core/lib/fastlane_core/cert_checker.rb +28 -0
- data/fastlane_core/lib/fastlane_core/project.rb +23 -0
- data/gym/lib/gym/code_signing_mapping.rb +32 -3
- data/gym/lib/gym/detect_values.rb +34 -2
- data/gym/lib/gym/generators/package_command_generator.rb +4 -0
- data/gym/lib/gym/generators/package_command_generator_xcode7.rb +47 -17
- data/gym/lib/gym/module.rb +8 -0
- data/gym/lib/gym/options.rb +25 -1
- data/gym/lib/gym/runner.rb +25 -4
- data/match/lib/match/encryption/openssl.rb +1 -1
- data/match/lib/match/generator.rb +17 -3
- data/match/lib/match/module.rb +4 -1
- data/match/lib/match/nuke.rb +54 -16
- data/match/lib/match/options.rb +20 -15
- data/match/lib/match/runner.rb +20 -8
- data/match/lib/match/spaceship_ensure.rb +19 -9
- data/match/lib/match/storage/git_storage.rb +5 -2
- data/scan/lib/scan/options.rb +6 -1
- data/snapshot/lib/snapshot/options.rb +12 -1
- data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +2 -0
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +11 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_feedback.rb +4 -0
- data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +6 -0
- data/spaceship/lib/spaceship/portal/app.rb +11 -2
- data/spaceship/lib/spaceship/tunes/iap_status.rb +5 -1
- metadata +20 -25
- data/fastlane/lib/fastlane/actions/.hockey.rb.swp +0 -0
- data/fastlane/lib/fastlane/actions/.slack.rb.swp +0 -0
- data/fastlane/lib/fastlane/actions/.update_project_provisioning.rb.swp +0 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- data/fastlane_core/lib/fastlane_core/.build_watcher.rb.swp +0 -0
- data/pilot/lib/pilot/.manager.rb.swp +0 -0
- data/spaceship/lib/spaceship/connect_api/.DS_Store +0 -0
- data/spaceship/lib/spaceship/portal/.certificate.rb.swp +0 -0
@@ -28,8 +28,8 @@ module Match
|
|
28
28
|
return Spaceship.client.team_id
|
29
29
|
end
|
30
30
|
|
31
|
-
def bundle_identifier_exists(username: nil, app_identifier: nil)
|
32
|
-
found = Spaceship.app.find(app_identifier)
|
31
|
+
def bundle_identifier_exists(username: nil, app_identifier: nil, platform: nil)
|
32
|
+
found = Spaceship.app.find(app_identifier, mac: platform == "macos")
|
33
33
|
return if found
|
34
34
|
|
35
35
|
require 'sigh/runner'
|
@@ -45,24 +45,34 @@ module Match
|
|
45
45
|
UI.user_error!("Couldn't find bundle identifier '#{app_identifier}' for the user '#{username}'")
|
46
46
|
end
|
47
47
|
|
48
|
-
def
|
49
|
-
|
50
|
-
cert.id
|
48
|
+
def certificates_exists(username: nil, certificate_ids: [], platform: nil)
|
49
|
+
Spaceship.certificate.all(mac: platform == "macos").each do |cert|
|
50
|
+
certificate_ids.delete(cert.id)
|
51
51
|
end
|
52
|
-
return if
|
52
|
+
return if certificate_ids.empty?
|
53
53
|
|
54
|
-
|
54
|
+
certificate_ids.each do |certificate_id|
|
55
|
+
UI.error("Certificate '#{certificate_id}' (stored in your storage) is not available on the Developer Portal")
|
56
|
+
end
|
55
57
|
UI.error("for the user #{username}")
|
56
58
|
UI.error("Make sure to use the same user and team every time you run 'match' for this")
|
57
59
|
UI.error("Git repository. This might be caused by revoking the certificate on the Dev Portal")
|
58
60
|
UI.user_error!("To reset the certificates of your Apple account, you can use the `fastlane match nuke` feature, more information on https://docs.fastlane.tools/actions/match/")
|
59
61
|
end
|
60
62
|
|
61
|
-
def profile_exists(username: nil, uuid: nil)
|
62
|
-
|
63
|
+
def profile_exists(username: nil, uuid: nil, platform: nil)
|
64
|
+
is_mac = platform == "macos"
|
65
|
+
found = Spaceship.provisioning_profile.all(mac: is_mac).find do |profile|
|
63
66
|
profile.uuid == uuid
|
64
67
|
end
|
65
68
|
|
69
|
+
# Look for iOS after looking for macOS (needed for Catalyst apps)
|
70
|
+
if !found && is_mac
|
71
|
+
found = Spaceship.provisioning_profile.all(mac: false).find do |profile|
|
72
|
+
profile.uuid == uuid
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
66
76
|
unless found
|
67
77
|
UI.error("Provisioning profile '#{uuid}' is not available on the Developer Portal for the user #{username}, fixing this now for you 🔨")
|
68
78
|
return false
|
@@ -73,8 +73,11 @@ module Match
|
|
73
73
|
self.working_directory = Dir.mktmpdir
|
74
74
|
|
75
75
|
command = "git clone #{self.git_url.shellescape} #{self.working_directory.shellescape}"
|
76
|
-
|
77
|
-
|
76
|
+
# HTTP headers are supposed to be be case insensitive but
|
77
|
+
# Bitbucket requires `Authorization: Basic` and `Authorization Bearer` to work
|
78
|
+
# https://github.com/fastlane/fastlane/pull/15928
|
79
|
+
command << " -c http.extraheader='Authorization: Basic #{self.git_basic_authorization}'" unless self.git_basic_authorization.nil?
|
80
|
+
command << " -c http.extraheader='Authorization: Bearer #{self.git_bearer_authorization}'" unless self.git_bearer_authorization.nil?
|
78
81
|
|
79
82
|
if self.shallow_clone
|
80
83
|
command << " --depth 1 --no-single-branch"
|
data/scan/lib/scan/options.rb
CHANGED
@@ -398,7 +398,12 @@ module Scan
|
|
398
398
|
description: "Allows for override of the default `xcodebuild` command",
|
399
399
|
type: String,
|
400
400
|
optional: true,
|
401
|
-
default_value: "env NSUnbufferedIO=YES xcodebuild")
|
401
|
+
default_value: "env NSUnbufferedIO=YES xcodebuild"),
|
402
|
+
FastlaneCore::ConfigItem.new(key: :cloned_source_packages_path,
|
403
|
+
env_name: "SCAN_CLONED_SOURCE_PACKAGES_PATH",
|
404
|
+
description: "Sets a custom path for Swift Package Manager dependencies",
|
405
|
+
type: String,
|
406
|
+
optional: true)
|
402
407
|
|
403
408
|
]
|
404
409
|
end
|
@@ -221,7 +221,18 @@ module Snapshot
|
|
221
221
|
env_name: "SNAPSHOT_EXECUTE_CONCURRENT_SIMULATORS",
|
222
222
|
description: "Take snapshots on multiple simulators concurrently. Note: This option is only applicable when running against Xcode 9",
|
223
223
|
default_value: true,
|
224
|
-
is_string: false)
|
224
|
+
is_string: false),
|
225
|
+
FastlaneCore::ConfigItem.new(key: :disable_slide_to_type,
|
226
|
+
env_name: "SNAPSHOT_DISABLE_SLIDE_TO_TYPE",
|
227
|
+
description: "Disable the simulator from showing the 'Slide to type' prompt",
|
228
|
+
default_value: false,
|
229
|
+
optional: true,
|
230
|
+
is_string: false),
|
231
|
+
FastlaneCore::ConfigItem.new(key: :cloned_source_packages_path,
|
232
|
+
env_name: "SNAPSHOT_CLONED_SOURCE_PACKAGES_PATH",
|
233
|
+
description: "Sets a custom path for Swift Package Manager dependencies",
|
234
|
+
type: String,
|
235
|
+
optional: true)
|
225
236
|
]
|
226
237
|
end
|
227
238
|
end
|
@@ -11,6 +11,7 @@ module Snapshot
|
|
11
11
|
attr_accessor :dark_mode
|
12
12
|
attr_accessor :reinstall_app
|
13
13
|
attr_accessor :app_identifier
|
14
|
+
attr_accessor :disable_slide_to_type
|
14
15
|
|
15
16
|
# xcode 8
|
16
17
|
attr_accessor :number_of_retries
|
@@ -41,6 +42,7 @@ module Snapshot
|
|
41
42
|
@output_simulator_logs = snapshot_config[:output_simulator_logs]
|
42
43
|
@output_directory = snapshot_config[:output_directory]
|
43
44
|
@concurrent_simulators = snapshot_config[:concurrent_simulators]
|
45
|
+
@disable_slide_to_type = snapshot_config[:disable_slide_to_type]
|
44
46
|
|
45
47
|
launch_arguments = Array(snapshot_config[:launch_arguments])
|
46
48
|
# if more than 1 set of arguments, use a tuple with an index
|
@@ -67,6 +67,9 @@ module Snapshot
|
|
67
67
|
# no need to reinstall if device has been erased
|
68
68
|
uninstall_app(type)
|
69
69
|
end
|
70
|
+
if launcher_config.disable_slide_to_type
|
71
|
+
disable_slide_to_type(type)
|
72
|
+
end
|
70
73
|
end
|
71
74
|
end
|
72
75
|
|
@@ -139,6 +142,14 @@ module Snapshot
|
|
139
142
|
end
|
140
143
|
end
|
141
144
|
|
145
|
+
def disable_slide_to_type(device_type)
|
146
|
+
device_udid = TestCommandGenerator.device_udid(device_type)
|
147
|
+
if device_udid
|
148
|
+
UI.message("Disabling slide to type on #{device_type}")
|
149
|
+
FastlaneCore::Simulator.disable_slide_to_type(udid: device_udid)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
142
153
|
def copy_simulator_logs(device_names, language, locale, launch_arguments)
|
143
154
|
return unless launcher_config.output_simulator_logs
|
144
155
|
|
@@ -66,6 +66,10 @@ module Spaceship
|
|
66
66
|
def self.all(filter: {}, includes: "tester,build,screenshots", limit: nil, sort: nil)
|
67
67
|
return Spaceship::ConnectAPI.get_beta_feedback(filter: filter, includes: includes, limit: limit, sort: sort)
|
68
68
|
end
|
69
|
+
|
70
|
+
def delete!
|
71
|
+
return Spaceship::ConnectAPI.delete_beta_feedback(feedback_id: self.id)
|
72
|
+
end
|
69
73
|
end
|
70
74
|
end
|
71
75
|
end
|
@@ -326,6 +326,12 @@ module Spaceship
|
|
326
326
|
params = Client.instance.build_params(filter: filter, includes: includes, limit: limit, sort: sort)
|
327
327
|
Client.instance.get("betaFeedbacks", params)
|
328
328
|
end
|
329
|
+
|
330
|
+
def delete_beta_feedback(feedback_id: nil)
|
331
|
+
raise "Feedback id is nil" if feedback_id.nil?
|
332
|
+
|
333
|
+
Client.instance.delete("betaFeedbacks/#{feedback_id}")
|
334
|
+
end
|
329
335
|
end
|
330
336
|
end
|
331
337
|
end
|
@@ -108,9 +108,18 @@ module Spaceship
|
|
108
108
|
# @return (App) The app you're looking for. This is nil if the app can't be found.
|
109
109
|
def find(bundle_id, mac: false)
|
110
110
|
raise "`bundle_id` parameter must not be nil" if bundle_id.nil?
|
111
|
-
all(mac: mac).find do |app|
|
112
|
-
|
111
|
+
found_app = all(mac: mac).find do |app|
|
112
|
+
app if app.bundle_id.casecmp(bundle_id) == 0
|
113
113
|
end
|
114
|
+
|
115
|
+
# Find catalyst enabled mac apps (look for mac first and then iOS)
|
116
|
+
if !found_app && mac
|
117
|
+
found_app = all(mac: false).find do |app|
|
118
|
+
app if app.bundle_id.casecmp(bundle_id) == 0
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
found_app
|
114
123
|
end
|
115
124
|
end
|
116
125
|
|
@@ -28,6 +28,9 @@ module Spaceship
|
|
28
28
|
# The developer took the app from the App Store
|
29
29
|
DEVELOPER_REMOVED_FROM_SALE = "Developer Removed From Sale"
|
30
30
|
|
31
|
+
# In-app purchase need developer's action
|
32
|
+
DEVELOPER_ACTION_NEEDED = "Developer Action Needed"
|
33
|
+
|
31
34
|
# Get the iap status matching based on a string (given by App Store Connect)
|
32
35
|
def self.get_from_string(text)
|
33
36
|
mapping = {
|
@@ -38,7 +41,8 @@ module Spaceship
|
|
38
41
|
'readyForSale' => APPROVED,
|
39
42
|
'deleted' => DELETED,
|
40
43
|
'rejected' => REJECTED,
|
41
|
-
'developerRemovedFromSale' => DEVELOPER_REMOVED_FROM_SALE
|
44
|
+
'developerRemovedFromSale' => DEVELOPER_REMOVED_FROM_SALE,
|
45
|
+
'developerActionNeeded' => DEVELOPER_ACTION_NEEDED
|
42
46
|
}
|
43
47
|
|
44
48
|
mapping.each do |itc_status, readable_status|
|
metadata
CHANGED
@@ -1,33 +1,35 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.141.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
+
- Jorge Revuelta H
|
8
|
+
- Maksym Grebenets
|
7
9
|
- Olivier Halligon
|
8
|
-
-
|
9
|
-
-
|
10
|
-
- Kohki Miki
|
11
|
-
- Stefan Natchev
|
10
|
+
- Daniel Jankowski
|
11
|
+
- Fumiya Nakamura
|
12
12
|
- Josh Holtz
|
13
|
-
- Jérôme Lacoste
|
14
|
-
- Maksym Grebenets
|
15
13
|
- Andrew McBurney
|
14
|
+
- Iulian Onofrei
|
15
|
+
- Kohki Miki
|
16
16
|
- Joshua Liebowitz
|
17
|
-
-
|
17
|
+
- Max Ott
|
18
|
+
- Stefan Natchev
|
19
|
+
- Jérôme Lacoste
|
20
|
+
- Aaron Brager
|
21
|
+
- Jan Piotrowski
|
22
|
+
- Danielle Tomlinson
|
18
23
|
- Jimmy Dee
|
19
|
-
-
|
24
|
+
- Manu Wallner
|
25
|
+
- Luka Mirosevic
|
20
26
|
- Felix Krause
|
21
|
-
-
|
27
|
+
- Matthew Ellis
|
22
28
|
- Helmut Januschka
|
23
|
-
- Aaron Brager
|
24
|
-
- Iulian Onofrei
|
25
|
-
- Luka Mirosevic
|
26
|
-
- Jorge Revuelta H
|
27
29
|
autorequire:
|
28
30
|
bindir: bin
|
29
31
|
cert_chain: []
|
30
|
-
date: 2020-01-
|
32
|
+
date: 2020-01-29 00:00:00.000000000 Z
|
31
33
|
dependencies:
|
32
34
|
- !ruby/object:Gem::Dependency
|
33
35
|
name: slack-notifier
|
@@ -1000,9 +1002,6 @@ files:
|
|
1000
1002
|
- fastlane/lib/fastlane.rb
|
1001
1003
|
- fastlane/lib/fastlane/action.rb
|
1002
1004
|
- fastlane/lib/fastlane/action_collector.rb
|
1003
|
-
- fastlane/lib/fastlane/actions/.hockey.rb.swp
|
1004
|
-
- fastlane/lib/fastlane/actions/.slack.rb.swp
|
1005
|
-
- fastlane/lib/fastlane/actions/.update_project_provisioning.rb.swp
|
1006
1005
|
- fastlane/lib/fastlane/actions/README.md
|
1007
1006
|
- fastlane/lib/fastlane/actions/actions_helper.rb
|
1008
1007
|
- fastlane/lib/fastlane/actions/adb.rb
|
@@ -1026,6 +1025,7 @@ files:
|
|
1026
1025
|
- fastlane/lib/fastlane/actions/build_android_app.rb
|
1027
1026
|
- fastlane/lib/fastlane/actions/build_app.rb
|
1028
1027
|
- fastlane/lib/fastlane/actions/build_ios_app.rb
|
1028
|
+
- fastlane/lib/fastlane/actions/build_mac_app.rb
|
1029
1029
|
- fastlane/lib/fastlane/actions/bundle_install.rb
|
1030
1030
|
- fastlane/lib/fastlane/actions/capture_android_screenshots.rb
|
1031
1031
|
- fastlane/lib/fastlane/actions/capture_ios_screenshots.rb
|
@@ -1056,7 +1056,7 @@ files:
|
|
1056
1056
|
- fastlane/lib/fastlane/actions/deliver.rb
|
1057
1057
|
- fastlane/lib/fastlane/actions/deploygate.rb
|
1058
1058
|
- fastlane/lib/fastlane/actions/device_grid/README.md
|
1059
|
-
- fastlane/lib/fastlane/actions/docs/
|
1059
|
+
- fastlane/lib/fastlane/actions/docs/build_app.md
|
1060
1060
|
- fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md
|
1061
1061
|
- fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md
|
1062
1062
|
- fastlane/lib/fastlane/actions/docs/check_app_store_metadata.md
|
@@ -1332,7 +1332,6 @@ files:
|
|
1332
1332
|
- fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj
|
1333
1333
|
- fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
|
1334
1334
|
- fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
|
1335
|
-
- fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/josh.xcuserdatad/UserInterfaceState.xcuserstate
|
1336
1335
|
- fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme
|
1337
1336
|
- fastlane/swift/FastlaneSwiftRunner/README.txt
|
1338
1337
|
- fastlane/swift/Gymfile.swift
|
@@ -1361,7 +1360,6 @@ files:
|
|
1361
1360
|
- fastlane_core/README.md
|
1362
1361
|
- fastlane_core/lib/assets/XMLTemplate.xml.erb
|
1363
1362
|
- fastlane_core/lib/fastlane_core.rb
|
1364
|
-
- fastlane_core/lib/fastlane_core/.build_watcher.rb.swp
|
1365
1363
|
- fastlane_core/lib/fastlane_core/analytics/action_completion_context.rb
|
1366
1364
|
- fastlane_core/lib/fastlane_core/analytics/action_launch_context.rb
|
1367
1365
|
- fastlane_core/lib/fastlane_core/analytics/analytics_event_builder.rb
|
@@ -1488,7 +1486,6 @@ files:
|
|
1488
1486
|
- pem/lib/pem/options.rb
|
1489
1487
|
- pilot/README.md
|
1490
1488
|
- pilot/lib/pilot.rb
|
1491
|
-
- pilot/lib/pilot/.manager.rb.swp
|
1492
1489
|
- pilot/lib/pilot/build_manager.rb
|
1493
1490
|
- pilot/lib/pilot/commands_generator.rb
|
1494
1491
|
- pilot/lib/pilot/features.rb
|
@@ -1620,7 +1617,6 @@ files:
|
|
1620
1617
|
- spaceship/lib/spaceship/client.rb
|
1621
1618
|
- spaceship/lib/spaceship/commands_generator.rb
|
1622
1619
|
- spaceship/lib/spaceship/connect_api.rb
|
1623
|
-
- spaceship/lib/spaceship/connect_api/.DS_Store
|
1624
1620
|
- spaceship/lib/spaceship/connect_api/client.rb
|
1625
1621
|
- spaceship/lib/spaceship/connect_api/model.rb
|
1626
1622
|
- spaceship/lib/spaceship/connect_api/models/app.rb
|
@@ -1663,7 +1659,6 @@ files:
|
|
1663
1659
|
- spaceship/lib/spaceship/launcher.rb
|
1664
1660
|
- spaceship/lib/spaceship/module.rb
|
1665
1661
|
- spaceship/lib/spaceship/playground.rb
|
1666
|
-
- spaceship/lib/spaceship/portal/.certificate.rb.swp
|
1667
1662
|
- spaceship/lib/spaceship/portal/app.rb
|
1668
1663
|
- spaceship/lib/spaceship/portal/app_group.rb
|
1669
1664
|
- spaceship/lib/spaceship/portal/app_service.rb
|
@@ -1803,7 +1798,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1803
1798
|
- !ruby/object:Gem::Version
|
1804
1799
|
version: '0'
|
1805
1800
|
requirements: []
|
1806
|
-
rubygems_version: 3.0.
|
1801
|
+
rubygems_version: 3.0.6
|
1807
1802
|
signing_key:
|
1808
1803
|
specification_version: 4
|
1809
1804
|
summary: The easiest way to automate beta deployments and releases for your iOS and
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|