From e72c5174b8adf7f59c15b2585da52f5dba49dc4c Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 6 Dec 2022 13:41:45 +0400 Subject: [PATCH] Update build scripts --- .gitlab-ci.yml | 20 +- build-system/Make/GenerateProfiles.py | 44 +++ build-system/Make/Make.py | 52 ++++ build-system/Make/RemoteBuild.py | 276 +++++++++++------- .../profiles/BroadcastUpload.mobileprovision | Bin 4657 -> 4790 bytes .../profiles/Intents.mobileprovision | Bin 4646 -> 4779 bytes .../NotificationContent.mobileprovision | Bin 4669 -> 4802 bytes .../NotificationService.mobileprovision | Bin 4669 -> 4802 bytes .../profiles/Share.mobileprovision | Bin 4627 -> 4760 bytes .../profiles/Telegram.mobileprovision | Bin 6173 -> 6673 bytes .../profiles/WatchApp.mobileprovision | Bin 4643 -> 4776 bytes .../profiles/WatchExtension.mobileprovision | Bin 4684 -> 4817 bytes .../profiles/Widget.mobileprovision | Bin 4629 -> 4762 bytes submodules/TelegramCore/BUILD | 26 ++ submodules/TelegramUI/BUILD | 45 +++ versions.json | 2 +- 16 files changed, 352 insertions(+), 113 deletions(-) create mode 100644 build-system/Make/GenerateProfiles.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f15bc151bb..32cb88ca4a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -18,7 +18,7 @@ internal: except: - tags script: - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 - python3 -u build-system/Make/DeployToAppCenter.py --configuration="$TELEGRAM_PRIVATE_DATA_PATH/appcenter-configurations/appcenter-internal.json" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip" environment: name: internal @@ -37,7 +37,7 @@ appstore_development: except: - tags script: - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 - python3 -u build-system/Make/DeployToAppCenter.py --configuration="$TELEGRAM_PRIVATE_DATA_PATH/appcenter-configurations/appstore-development.json" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip" environment: name: appstore-development @@ -55,7 +55,7 @@ experimental_i: except: - tags script: - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 - python3 -u build-system/Make/DeployToAppCenter.py --configuration="$TELEGRAM_PRIVATE_DATA_PATH/appcenter-configurations/appcenter-experimental.json" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip" environment: name: experimental @@ -73,7 +73,7 @@ experimental: except: - tags script: - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 - python3 -u build-system/Make/DeployToAppCenter.py --configuration="$TELEGRAM_PRIVATE_DATA_PATH/appcenter-configurations/appcenter-experimental2.json" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip" environment: name: experimental-2 @@ -92,7 +92,7 @@ beta_testflight: except: - tags script: - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="build-system/appstore-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=appstore --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="build-system/appstore-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=appstore --configuration=release_arm64 environment: name: testflight_llc artifacts: @@ -110,7 +110,7 @@ deploy_beta_testflight: except: - tags script: - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-deploy-testflight --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip" + - python3 -u build-system/Make/Make.py remote-deploy-testflight --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip" environment: name: testflight_llc @@ -125,8 +125,8 @@ verifysanity_beta_testflight: - tags script: - rm -rf build/verify-input && mkdir -p build/verify-input && mv build/artifacts/Telegram.ipa build/verify-input/TelegramVerifySource.ipa - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="build-system/appstore-configuration.json" --codesigningInformationPath=build-system/fake-codesigning --configuration=release_arm64 - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-ipa-diff --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa1="build/artifacts/Telegram.ipa" --ipa2="build/verify-input/TelegramVerifySource.ipa" + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="build-system/appstore-configuration.json" --codesigningInformationPath=build-system/fake-codesigning --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-ipa-diff --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa1="build/artifacts/Telegram.ipa" --ipa2="build/verify-input/TelegramVerifySource.ipa" - if [ $? -ne 0 ]; then echo "Verification failed"; mkdir -p build/verifysanity_artifacts; cp build/artifacts/Telegram.ipa build/verifysanity_artifacts/; exit 1; fi environment: name: testflight_llc @@ -147,8 +147,8 @@ verify_beta_testflight: - tags script: - rm -rf build/verify-input && mkdir -p build/verify-input && mv build/artifacts/Telegram.ipa build/verify-input/TelegramVerifySource.ipa - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --configurationPath="build-system/appstore-configuration.json" --codesigningInformationPath=build-system/fake-codesigning --configuration=release_arm64 - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-ipa-diff --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa1="build/artifacts/Telegram.ipa" --ipa2="build/verify-input/TelegramVerifySource.ipa" + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --configurationPath="build-system/appstore-configuration.json" --codesigningInformationPath=build-system/fake-codesigning --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-ipa-diff --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa1="build/artifacts/Telegram.ipa" --ipa2="build/verify-input/TelegramVerifySource.ipa" - if [ $? -ne 0 ]; then echo "Verification failed"; mkdir -p build/verify_artifacts; cp build/artifacts/Telegram.ipa build/verify_artifacts/; exit 1; fi environment: name: testflight_llc diff --git a/build-system/Make/GenerateProfiles.py b/build-system/Make/GenerateProfiles.py new file mode 100644 index 0000000000..0992d95a82 --- /dev/null +++ b/build-system/Make/GenerateProfiles.py @@ -0,0 +1,44 @@ +import json +import os +import sys +import shutil +import tempfile +import plistlib +import argparse + +from BuildEnvironment import run_executable_with_output, check_run_system + + +def get_certificate_base64(): + certificate_data = run_executable_with_output('security', arguments=['find-certificate', '-c', 'Apple Distribution: Telegram FZ-LLC (C67CF9S4VU)', '-p']) + certificate_data = certificate_data.replace('-----BEGIN CERTIFICATE-----', '') + certificate_data = certificate_data.replace('-----END CERTIFICATE-----', '') + certificate_data = certificate_data.replace('\n', '') + return certificate_data + + +def process_provisioning_profile(source, destination, certificate_data): + parsed_plist = run_executable_with_output('security', arguments=['cms', '-D', '-i', source], check_result=True) + parsed_plist_file = tempfile.mktemp() + with open(parsed_plist_file, 'w+') as file: + file.write(parsed_plist) + + run_executable_with_output('plutil', arguments=['-remove', 'DeveloperCertificates.0', parsed_plist_file]) + run_executable_with_output('plutil', arguments=['-insert', 'DeveloperCertificates.0', '-data', certificate_data, parsed_plist_file]) + run_executable_with_output('plutil', arguments=['-remove', 'DER-Encoded-Profile', parsed_plist_file]) + + run_executable_with_output('security', arguments=['cms', '-S', '-N', 'Apple Distribution: Telegram FZ-LLC (C67CF9S4VU)', '-i', parsed_plist_file, '-o', destination]) + + os.unlink(parsed_plist_file) + + +def generate_provisioning_profiles(source_path, destination_path): + certificate_data = get_certificate_base64() + + if not os.path.exists(destination_path): + print('{} does not exits'.format(destination_path)) + sys.exit(1) + + for file_name in os.listdir(source_path): + if file_name.endswith('.mobileprovision'): + process_provisioning_profile(source=source_path + '/' + file_name, destination=destination_path + '/' + file_name, certificate_data=certificate_data) diff --git a/build-system/Make/Make.py b/build-system/Make/Make.py index 767965719d..b485cba259 100644 --- a/build-system/Make/Make.py +++ b/build-system/Make/Make.py @@ -14,6 +14,7 @@ from ProjectGeneration import generate from BazelLocation import locate_bazel from BuildConfiguration import CodesigningSource, GitCodesigningSource, DirectoryCodesigningSource, BuildConfiguration, build_configuration_from_json import RemoteBuild +import GenerateProfiles class ResolvedCodesigningData: @@ -920,6 +921,12 @@ if __name__ == '__main__': type=str, help='DarwinContainers host address.' ) + remote_build_parser.add_argument( + '--darwinContainers', + required=True, + type=str, + help='DarwinContainers script path.' + ) remote_build_parser.add_argument( '--configuration', choices=[ @@ -940,6 +947,15 @@ if __name__ == '__main__': help='Bazel remote cache host address.' ) + generate_profiles_build_parser = subparsers.add_parser('generate-verification-profiles', help='Generate provisioning profiles that can be used to build a veritication IPA.') + add_codesigning_common_arguments(generate_profiles_build_parser) + generate_profiles_build_parser.add_argument( + '--destination', + required=True, + type=str, + help='Path to the destination directory.' + ) + remote_upload_testflight_parser = subparsers.add_parser('remote-deploy-testflight', help='Build the app using a remote environment.') remote_upload_testflight_parser.add_argument( '--darwinContainersHost', @@ -947,6 +963,12 @@ if __name__ == '__main__': type=str, help='DarwinContainers host address.' ) + remote_upload_testflight_parser.add_argument( + '--darwinContainers', + required=True, + type=str, + help='DarwinContainers script path.' + ) remote_upload_testflight_parser.add_argument( '--ipa', required=True, @@ -967,6 +989,12 @@ if __name__ == '__main__': type=str, help='DarwinContainers host address.' ) + remote_ipadiff_parser.add_argument( + '--darwinContainers', + required=True, + type=str, + help='DarwinContainers script path.' + ) remote_ipadiff_parser.add_argument( '--ipa1', required=True, @@ -1024,11 +1052,33 @@ if __name__ == '__main__': shutil.copyfile(args.configurationPath, remote_input_path + '/configuration.json') RemoteBuild.remote_build( + darwin_containers_path=args.darwinContainers, darwin_containers_host=args.darwinContainersHost, bazel_cache_host=args.cacheHost, configuration=args.configuration, build_input_data_path=remote_input_path ) + elif args.commandName == 'generate-verification-profiles': + base_path = os.getcwd() + remote_input_path = '{}/build-input/remote-input'.format(base_path) + if os.path.exists(remote_input_path): + shutil.rmtree(remote_input_path) + os.makedirs(remote_input_path) + os.makedirs(remote_input_path + '/certs') + os.makedirs(remote_input_path + '/profiles') + + if os.path.exists(args.destination): + shutil.rmtree(args.destination) + os.makedirs(args.destination) + + resolve_configuration( + base_path=os.getcwd(), + bazel_command_line=None, + arguments=args, + additional_codesigning_output_path=remote_input_path + ) + + GenerateProfiles.generate_provisioning_profiles(source_path=remote_input_path + '/profiles', destination_path=args.destination) elif args.commandName == 'remote-deploy-testflight': env = os.environ if 'APPSTORE_CONNECT_USERNAME' not in env: @@ -1039,6 +1089,7 @@ if __name__ == '__main__': sys.exit(1) RemoteBuild.remote_deploy_testflight( + darwin_containers_path=args.darwinContainers, darwin_containers_host=args.darwinContainersHost, ipa_path=args.ipa, dsyms_path=args.dsyms, @@ -1047,6 +1098,7 @@ if __name__ == '__main__': ) elif args.commandName == 'remote-ipa-diff': RemoteBuild.remote_ipa_diff( + darwin_containers_path=args.darwinContainers, darwin_containers_host=args.darwinContainersHost, ipa1_path=args.ipa1, ipa2_path=args.ipa2 diff --git a/build-system/Make/RemoteBuild.py b/build-system/Make/RemoteBuild.py index 59cdf15cfc..d84375f8df 100644 --- a/build-system/Make/RemoteBuild.py +++ b/build-system/Make/RemoteBuild.py @@ -4,41 +4,61 @@ import json import shutil import shlex import tempfile +import importlib.util +from importlib.machinery import SourceFileLoader from BuildEnvironment import run_executable_with_output + +def import_module_from_file(module_name, file_path): + if not os.path.exists(file_path): + print('{} does not exist'.format(file_path)) + sys.exit(1) + + loader = SourceFileLoader(module_name, file_path) + spec = importlib.util.spec_from_file_location(module_name, loader=loader) + module = importlib.util.module_from_spec(spec) + + sys.modules[module_name] = module + spec.loader.exec_module(module) + return module + + def session_scp_upload(session, source_path, destination_path): scp_command = 'scp -i {privateKeyPath} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -pr {source_path} containerhost@"{ipAddress}":{destination_path}'.format( - privateKeyPath=session.privateKeyPath, - ipAddress=session.ipAddress, + privateKeyPath=session.private_key_path, + ipAddress=session.ip_address, source_path=shlex.quote(source_path), destination_path=shlex.quote(destination_path) ) if os.system(scp_command) != 0: print('Command {} finished with a non-zero status'.format(scp_command)) + def session_scp_download(session, source_path, destination_path): scp_command = 'scp -i {privateKeyPath} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -pr containerhost@"{ipAddress}":{source_path} {destination_path}'.format( - privateKeyPath=session.privateKeyPath, - ipAddress=session.ipAddress, + privateKeyPath=session.private_key_path, + ipAddress=session.ip_address, source_path=shlex.quote(source_path), destination_path=shlex.quote(destination_path) ) if os.system(scp_command) != 0: print('Command {} finished with a non-zero status'.format(scp_command)) + def session_ssh(session, command): ssh_command = 'ssh -i {privateKeyPath} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null containerhost@"{ipAddress}" -o ServerAliveInterval=60 -t "{command}"'.format( - privateKeyPath=session.privateKeyPath, - ipAddress=session.ipAddress, + privateKeyPath=session.private_key_path, + ipAddress=session.ip_address, command=command ) return os.system(ssh_command) -def remote_build(darwin_containers_host, bazel_cache_host, configuration, build_input_data_path): - macos_version = '12.5' - from darwin_containers import DarwinContainers +def remote_build(darwin_containers_path, darwin_containers_host, bazel_cache_host, configuration, build_input_data_path): + macos_version = '13.0' + + DarwinContainers = import_module_from_file('darwin-containers', darwin_containers_path) base_dir = os.getcwd() @@ -83,67 +103,88 @@ def remote_build(darwin_containers_host, bazel_cache_host, configuration, build_ print('Compressing source code...') os.system('find . -type f -a -not -regex "\\." -a -not -regex ".*\\./git" -a -not -regex ".*\\./git/.*" -a -not -regex "\\./bazel-bin" -a -not -regex "\\./bazel-bin/.*" -a -not -regex "\\./bazel-out" -a -not -regex "\\./bazel-out/.*" -a -not -regex "\\./bazel-testlogs" -a -not -regex "\\./bazel-testlogs/.*" -a -not -regex "\\./bazel-telegram-ios" -a -not -regex "\\./bazel-telegram-ios/.*" -a -not -regex "\\./buildbox" -a -not -regex "\\./buildbox/.*" -a -not -regex "\\./buck-out" -a -not -regex "\\./buck-out/.*" -a -not -regex "\\./\\.buckd" -a -not -regex "\\./\\.buckd/.*" -a -not -regex "\\./build" -a -not -regex "\\./build/.*" -print0 | tar cf "{buildbox_dir}/transient-data/source.tar" --null -T -'.format(buildbox_dir=buildbox_dir)) - darwinContainers = DarwinContainers(serverAddress=darwin_containers_host, verbose=False) - print('Opening container session...') - with darwinContainers.workingImageSession(name=image_name) as session: - print('Uploading data to container...') - session_scp_upload(session=session, source_path=build_input_data_path, destination_path='telegram-build-input') - session_scp_upload(session=session, source_path='{base_dir}/{buildbox_dir}/transient-data/source.tar'.format(base_dir=base_dir, buildbox_dir=buildbox_dir), destination_path='') - guest_build_sh = ''' - set -x - set -e + def handle_ssh_credentials(credentials): + with DarwinContainers.ContainerSession(credentials=credentials) as session: + print('Uploading data to container...') - mkdir /Users/Shared/telegram-ios - cd /Users/Shared/telegram-ios + session_scp_upload(session=session, source_path=build_input_data_path, destination_path='telegram-build-input') + session_scp_upload(session=session, source_path='{base_dir}/{buildbox_dir}/transient-data/source.tar'.format(base_dir=base_dir, buildbox_dir=buildbox_dir), destination_path='') - tar -xf $HOME/source.tar + guest_build_sh = ''' + set -x + set -e - python3 build-system/Make/ImportCertificates.py --path $HOME/telegram-build-input/certs + mkdir /Users/Shared/telegram-ios + cd /Users/Shared/telegram-ios - ''' + tar -xf $HOME/source.tar - guest_build_sh += 'python3 build-system/Make/Make.py \\' - if bazel_cache_host is not None: - guest_build_sh += '--cacheHost="{}" \\'.format(bazel_cache_host) - guest_build_sh += 'build \\' - guest_build_sh += '' - guest_build_sh += '--buildNumber={} \\'.format(build_number) - guest_build_sh += '--configuration={} \\'.format(configuration) - guest_build_sh += '--configurationPath=$HOME/telegram-build-input/configuration.json \\' - guest_build_sh += '--codesigningInformationPath=$HOME/telegram-build-input \\' - guest_build_sh += '--outputBuildArtifactsPath=/Users/Shared/telegram-ios/build/artifacts \\' + python3 build-system/Make/ImportCertificates.py --path $HOME/telegram-build-input/certs - guest_build_file_path = tempfile.mktemp() - with open(guest_build_file_path, 'w+') as file: - file.write(guest_build_sh) - session_scp_upload(session=session, source_path=guest_build_file_path, destination_path='guest-build-telegram.sh') - os.unlink(guest_build_file_path) + ''' - print('Executing remote build...') + guest_build_sh += 'python3 build-system/Make/Make.py \\' + if bazel_cache_host is not None: + guest_build_sh += '--cacheHost="{}" \\'.format(bazel_cache_host) + guest_build_sh += 'build \\' + guest_build_sh += '' + guest_build_sh += '--buildNumber={} \\'.format(build_number) + guest_build_sh += '--configuration={} \\'.format(configuration) + guest_build_sh += '--configurationPath=$HOME/telegram-build-input/configuration.json \\' + guest_build_sh += '--codesigningInformationPath=$HOME/telegram-build-input \\' + guest_build_sh += '--outputBuildArtifactsPath=/Users/Shared/telegram-ios/build/artifacts \\' - session_ssh(session=session, command='bash -l guest-build-telegram.sh') + guest_build_file_path = tempfile.mktemp() + with open(guest_build_file_path, 'w+') as file: + file.write(guest_build_sh) + session_scp_upload(session=session, source_path=guest_build_file_path, destination_path='guest-build-telegram.sh') + os.unlink(guest_build_file_path) - print('Retrieving build artifacts...') + print('Executing remote build...') - artifacts_path='{base_dir}/build/artifacts'.format(base_dir=base_dir) - if os.path.exists(artifacts_path): - shutil.rmtree(artifacts_path) - os.makedirs(artifacts_path, exist_ok=True) + session_ssh(session=session, command='bash -l guest-build-telegram.sh') - session_scp_download(session=session, source_path='/Users/Shared/telegram-ios/build/artifacts/*', destination_path='{artifacts_path}/'.format(artifacts_path=artifacts_path)) + print('Retrieving build artifacts...') - if os.path.exists(artifacts_path + '/Telegram.ipa'): - print('Artifacts have been stored at {}'.format(artifacts_path)) - else: - print('Telegram.ipa not found') - sys.exit(1) + artifacts_path='{base_dir}/build/artifacts'.format(base_dir=base_dir) + if os.path.exists(artifacts_path): + shutil.rmtree(artifacts_path) + os.makedirs(artifacts_path, exist_ok=True) -def remote_deploy_testflight(darwin_containers_host, ipa_path, dsyms_path, username, password): + session_scp_download(session=session, source_path='/Users/Shared/telegram-ios/build/artifacts/*', destination_path='{artifacts_path}/'.format(artifacts_path=artifacts_path)) + + if os.path.exists(artifacts_path + '/Telegram.ipa'): + print('Artifacts have been stored at {}'.format(artifacts_path)) + sys.exit(0) + else: + print('Telegram.ipa not found') + sys.exit(1) + + DarwinContainers.run_remote_ssh(credentials=credentials, command='') + sys.exit(0) + + def handle_stopped(): + pass + + DarwinContainers.DarwinContainers( + server_address=darwin_containers_host, + verbose=False + ).run_image( + name=image_name, + is_base=False, + is_gui=True, + is_daemon=False, + on_ssh_credentials=handle_ssh_credentials, + on_stopped=handle_stopped + ) + + +def remote_deploy_testflight(darwin_containers_path, darwin_containers_host, ipa_path, dsyms_path, username, password): macos_version = '12.5' - from darwin_containers import DarwinContainers + DarwinContainers = import_module_from_file('darwin-containers', darwin_containers_path) configuration_path = 'versions.json' xcode_version = '' @@ -159,34 +200,50 @@ def remote_deploy_testflight(darwin_containers_host, ipa_path, dsyms_path, usern print('Image name: {}'.format(image_name)) - darwinContainers = DarwinContainers(serverAddress=darwin_containers_host, verbose=False) - print('Opening container session...') - with darwinContainers.workingImageSession(name=image_name) as session: - print('Uploading data to container...') - session_scp_upload(session=session, source_path=ipa_path, destination_path='') - session_scp_upload(session=session, source_path=dsyms_path, destination_path='') + def handle_ssh_credentials(credentials): + with DarwinContainers.ContainerSession(credentials=credentials) as session: + print('Uploading data to container...') + session_scp_upload(session=session, source_path=ipa_path, destination_path='') + session_scp_upload(session=session, source_path=dsyms_path, destination_path='') - guest_upload_sh = ''' - set -e + guest_upload_sh = ''' + set -e - export DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS="-t DAV" - FASTLANE_PASSWORD="{password}" xcrun altool --upload-app --type ios --file "Telegram.ipa" --username "{username}" --password "@env:FASTLANE_PASSWORD" - '''.format(username=username, password=password) + export DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS="-t DAV" + FASTLANE_PASSWORD="{password}" xcrun altool --upload-app --type ios --file "Telegram.ipa" --username "{username}" --password "@env:FASTLANE_PASSWORD" + '''.format(username=username, password=password) - guest_upload_file_path = tempfile.mktemp() - with open(guest_upload_file_path, 'w+') as file: - file.write(guest_upload_sh) - session_scp_upload(session=session, source_path=guest_upload_file_path, destination_path='guest-upload-telegram.sh') - os.unlink(guest_upload_file_path) + guest_upload_file_path = tempfile.mktemp() + with open(guest_upload_file_path, 'w+') as file: + file.write(guest_upload_sh) + session_scp_upload(session=session, source_path=guest_upload_file_path, destination_path='guest-upload-telegram.sh') + os.unlink(guest_upload_file_path) - print('Executing remote upload...') - session_ssh(session=session, command='bash -l guest-upload-telegram.sh') + print('Executing remote upload...') + session_ssh(session=session, command='bash -l guest-upload-telegram.sh') + sys.exit(0) -def remote_ipa_diff(darwin_containers_host, ipa1_path, ipa2_path): - macos_version = '12.5' + def handle_stopped(): + pass - from darwin_containers import DarwinContainers + DarwinContainers.DarwinContainers( + server_address=darwin_containers_host, + verbose=False + ).run_image( + name=image_name, + is_base=False, + is_gui=True, + is_daemon=False, + on_ssh_credentials=handle_ssh_credentials, + on_stopped=handle_stopped + ) + + +def remote_ipa_diff(darwin_containers_path, darwin_containers_host, ipa1_path, ipa2_path): + macos_version = '13.0' + + DarwinContainers = import_module_from_file('darwin-containers', darwin_containers_path) configuration_path = 'versions.json' xcode_version = '' @@ -202,38 +259,53 @@ def remote_ipa_diff(darwin_containers_host, ipa1_path, ipa2_path): print('Image name: {}'.format(image_name)) - darwinContainers = DarwinContainers(serverAddress=darwin_containers_host, verbose=False) - print('Opening container session...') - with darwinContainers.workingImageSession(name=image_name) as session: - print('Uploading data to container...') - session_scp_upload(session=session, source_path='tools/ipadiff.py', destination_path='ipadiff.py') - session_scp_upload(session=session, source_path='tools/main.cpp', destination_path='main.cpp') - session_scp_upload(session=session, source_path=ipa1_path, destination_path='ipa1.ipa') - session_scp_upload(session=session, source_path=ipa2_path, destination_path='ipa2.ipa') - guest_upload_sh = ''' - set -e + def handle_ssh_credentials(credentials): + with DarwinContainers.ContainerSession(credentials=credentials) as session: + print('Uploading data to container...') + session_scp_upload(session=session, source_path='tools/ipadiff.py', destination_path='ipadiff.py') + session_scp_upload(session=session, source_path='tools/main.cpp', destination_path='main.cpp') + session_scp_upload(session=session, source_path=ipa1_path, destination_path='ipa1.ipa') + session_scp_upload(session=session, source_path=ipa2_path, destination_path='ipa2.ipa') - python3 ipadiff.py ipa1.ipa ipa2.ipa - echo $? > result.txt - ''' + guest_upload_sh = ''' + set -e - guest_upload_file_path = tempfile.mktemp() - with open(guest_upload_file_path, 'w+') as file: - file.write(guest_upload_sh) - session_scp_upload(session=session, source_path=guest_upload_file_path, destination_path='guest-ipa-diff.sh') - os.unlink(guest_upload_file_path) + python3 ipadiff.py ipa1.ipa ipa2.ipa + echo $? > result.txt + ''' - print('Executing remote ipa-diff...') - session_ssh(session=session, command='bash -l guest-ipa-diff.sh') - guest_result_path = tempfile.mktemp() - session_scp_download(session=session, source_path='result.txt', destination_path=guest_result_path) - guest_result = '' - with open(guest_result_path, 'r') as file: - guest_result = file.read().rstrip() - os.unlink(guest_result_path) + guest_upload_file_path = tempfile.mktemp() + with open(guest_upload_file_path, 'w+') as file: + file.write(guest_upload_sh) + session_scp_upload(session=session, source_path=guest_upload_file_path, destination_path='guest-ipa-diff.sh') + os.unlink(guest_upload_file_path) - if guest_result != '0': - sys.exit(1) + print('Executing remote ipa-diff...') + session_ssh(session=session, command='bash -l guest-ipa-diff.sh') + guest_result_path = tempfile.mktemp() + session_scp_download(session=session, source_path='result.txt', destination_path=guest_result_path) + guest_result = '' + with open(guest_result_path, 'r') as file: + guest_result = file.read().rstrip() + os.unlink(guest_result_path) + if guest_result != '0': + sys.exit(1) + sys.exit(0) + + def handle_stopped(): + pass + + DarwinContainers.DarwinContainers( + server_address=darwin_containers_host, + verbose=False + ).run_image( + name=image_name, + is_base=False, + is_gui=True, + is_daemon=False, + on_ssh_credentials=handle_ssh_credentials, + on_stopped=handle_stopped + ) diff --git a/build-system/fake-codesigning/profiles/BroadcastUpload.mobileprovision b/build-system/fake-codesigning/profiles/BroadcastUpload.mobileprovision index 90bc0e0e03f08a3cfe9f94470216ecd2b10b3bea..873aafa1f2cdc58d68afb4c295487fb1c7ea073e 100644 GIT binary patch delta 1598 zcmdm}vQ2fvd`1ByT|+}%1H%wQb1Ne=D`Vr$>ly7h1dMeJ4RnpnLkumg49%=ej5q(~ z%wl9Tn4H0_s$!U$lw_8iY^-Z)nv$ezVqu)Do0wv5qHAQ3YG!1fl$c~;N;i-b=QT1iG%z+aurx3#JIH3o4Fpj;B|H54`w1UZtMhbwq;mw<>0F>aXr zmq)RF=e3&s*Z-AAPf@(3;JW8*%j=^lp05-`j;Tsku07n)G`YB-s6s z&p&*+bp4(cRY`3B*^jbuuH3k}#r9bL*#~ozc9b9fcvbL=`XQ}@lj0j~BHz9lATQh&}$=z_J zg161{LvzR4O}c`KPc!;lvp?CpCtd&FKXG?hMR97vy~lyCcFvhq(S&(bw0~_Szs{A^0A1qh|G3)Sj#RG^P%st z!cC)VCqk!Ptgl8(9n4LPj0|1p=WtxFk#8!?xUk3d?f%9y&%VxU-n;(nxr`ZIS7dvm z?`w#fJGp!knyq_(OLK~8?1i+12LDyh`(0S1yM9k;FPuGl>%CO1=I7I296S1?{=AmN zU7amUL@%(;KFWM0&_Xftf&Kxl+=rbZTQ?lmetT)p!@Jxno9uXu59#~gzp&(*ukD&2 zrLTfJzI=Q5fW7IWU9^VPD?y=oBqV- zS%r=)GKXGo zwb>Y17@N!mSPUyjb|WZPXA$eD#&$MtXaT}0z{G7>v4GSdA-WJjE3Q~s8CaSa89W7( zEN_-Li2H8p%gsvT+^Va1(_oH~UtQ5Hhmwd{?yJu@+}a>enJZlMULaa*f#UhuULiJ8 zyGs@o&rr5ICEB=l!taAAKkDNwIbZ!vZ~IZOocYS0awgen>=oO#oxkR0zUQ&!O4;8l z4*&bMf%B5)F=^q99)n=F^UO>e3%3=%+W7J^OKD>1V|(eQHyxc5?__h$yKp67r;>tB zv!7$&Vauf{G0QeQIvvVZ5k2GCdy9un=Fha(skul`Twe5U;ZLvMlWXHU!04rd`1C7T|)z1BeM`gb1M@AD-*NL>ly7h1dI@(h6Yv!2AltKW-&6FOwQm| zRWV35GdDFcG|@FlGc?sTF*7pKwJ=LD)HO>nNj5bxPBSwwH<-MU+b_1*poux(pouAb z0W%XL6B8q&0WTY;R+~rLcV0$DZdL|^SVKz#b2jEs7G@p;$AW^KR0WsJ;*z4wq|%bi z{5&g#kkp*i^rFOE1-B?&A0KB04QDfRXE)1Wldw?D$q#uH;zNTC(1db8|uYkZ7&LMo*b}mcS#f1ov**x&%A#8{;=1s>C@a^ zr`UO4|5NWLWPE1j6vmRW{RY`T>U);C?>jQ*)w1vv<}ZJ|ZoDtXKPyRd(%~1AZt%!j zx5~*0Zhdo>vr&S%rhCcsv!Z)-t?qK&N_ZHc#eHxl6Eh`)s+zG+y2-T6<^KYL$CkOP8-&xNdITp-}Ij=gZR`xHs*c$FH2oZsTiNDRIJ@M**}``d zb}jwcoWa!#aD3>*_Yv2Ln#!*?!!YmCRQDUw3AF=Msr;S2Vq) zPyCkQd$(`h%T?!=&FeR8V%h>s@EbsBJ&EF^ClVSAGKiCnRhy5QNs5(WK@+3;WFGB7-Y~0XH%PGLb zZJ4rva-Y>hOh!sWtgH+yO^gijdmpb1dhK)IQ#IRL_j8;tS4ZER{PfH^rqDxi$-I~T zZ;IDhod-Ep$xf-El93v%T85d}DJyUO1QG@HQ;;`wDFoDWoce)s=e&+B(eDnaKO-v8ZW2o0m)rZmPH59L8%K&FdLI*Xrf-fSlazY0Ctg_wp|elQ|&u z?o#g5b0>ao-?n3iLWY?@g?`)ZyjP+ullOPXD5DO<2{KF}vBxXTrA|`c)g* l#1zVJhW1YOn}6!$>GQHz=Ko@H>73E#u6ADS=`{v00052OF*^VN diff --git a/build-system/fake-codesigning/profiles/Intents.mobileprovision b/build-system/fake-codesigning/profiles/Intents.mobileprovision index 3de2acb55c38460542405c328beec881569fd1ac..013624d4f988fd715af100483d088052ad6b80f9 100644 GIT binary patch delta 1607 zcmZ3cvRZY+97X{nT|+}%1H%wQb1NfLD-*-bYZ$FK1dMeJ4RnpnLkumg49%=ej5mMd zOk-p;m>kQks$y)El$w-eXsm0Rnrx_RVqs#YYnhyEu4|T@Xr5x8m~3uom^67Aw;$&& zgC^!}22D)!CjaG@&?_|5Hqc~a4rO8HQOXR+$j?hva7iso&B-rFEwWMwPR&VE2+mB; zOHBa^=jKliA8SVeJa!oA0VuXfIvYQ6sE zlbC>6`GGHAEh>%K7nSy2WN%4o*=6pH7FOF_tadzJ;TY&%rTF~U^qo5oisdXm@_znu zor}UPNmoCuRr#5m`b}}=7n|eP@~+=`mUfhhnUR5Uail@`WEnoodRbr)%kr^^v53re zcv#CW6Z4_(vBFKGYbQddU97K04oYrtP%<)fou9*Ty+*#NEaSo+*SGr{&pi7&uX*qK zv*$8qbX}3{jlQoTYVPFnNocn2{VmNYrm+{&5*qwhJ@0p6k?#6ErM+o5_fgBED^oHI{PT|l|T!{$Orldv~nMIhHTw%So`gzJrD14t8B94F+Qa4 zfB(XgYreK?ew4ln?)dWU;RE)ji+0f(R*zSf9dylS=zm~%QQ}LN{`wz0Rv*q!k^CAp zwRBnI-8=irw)TJRn>c4>bc~0@k~uq_o^JGJejxLEWy(}R#(L%V?oCe)s~oxgrLm3Y z?xlC17;O3zpJx?1vdA2I8MbW0$C^dve+~9WEM#r=4OtK`I?b5T->`}46EHKqV*=*G zG73_)tB>2{1Rg;%Vlo%VE>1R9Z9ZluDOQFBO^kt)pYdylO1-XQ*|^ni{h{OMi{qEC zIk$9Ti;Y2JD;uXa8zT#2leqwkVFk%<1m*ZFVjb1k&c+QZ6$F^L4J#Iq8YDy)FrY9% z%G<203@lBI40#PqZTwr-RZq_R8j<=c^pMZ-SG(rjQWQVeTC-S;d)9Kzc@d_2Kh9b3 zEcV^PC(G51AL-pVV=-%{b!(Z>L!PVM`QP;H5B;k*+5K}qql%}(yWmuxWz#+;>H>4p zWyR%slR5i$O|xI?V#}zR)><@^^R4Dz(L*y%?>cew>7n%h>$La#?bBT8A9Frtg4f2i z^D`GSUhO|omlnN?=dMo3d9{^?SO05GShvNQ$))+XvhLp(!8|XHZ4pYJ_U+E%dbYi` zL0Z9i7b3-zRy(O%eK}FY`*u>hkc7a$61UZtKN<)!&e*(X(>Wt~L5oQfC)iBh+^=4q cr@e7z0e{%R9d+&3Vobk(t(qz?P{9BO0HpqTp#T5? delta 1402 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 MA9Zk4-eCX(03AAW_5c6? delta 1438 zcmX@4x>sexVnzW&T|)z1BeM`gb1P#@D-+Yrn;D%r1dI@(h6Yv!2Af&A@)#LSCYNxl zs-z?uTO?T+CF&-cq?zcNBqyfmS{PZF=vt(vS{R#}nV1`qaY<2TQfWzM zex8*=NNP@MdQoDof?JfXkB_s0hO?QuvzukGNm!`nUFm3 zvcGRJ5&V7eNur-{rm=eF9-&y*2~3$xnJ){^Ppz1u#b$6nZ*owQv{JX6`oyU=t@TZD z6}|3@&#LTNVj{Doqv^W)b?5Mz4fSHNwiksrPY&3(yQGQh&evb;XI?*kf7ol+^l5Id zQ|!F2|Ec#AGCs3%3S&vxeuL~E^*zhn_Z^w@YFYRS^OrwfH{KWHpOvIJ>F|q5H+W>N zTjk^gx4t>c*(kwW)4gQ+S<$_^R(H8>B|Hq!;yyT&iJ6gsaj}(w#pGx{%X-wPWNu<) zWLR_J#WuZ`eYV_U8ZYk^t-UjAwaUG&rOQ_>TsJrFP^fp%^W|v|+?)2!<5yarkv^}_ zL#57db;JIVV%9ib#)u-g8`@VY(MVHN@gqnuRAlobBV;aE1KTY zCw|NDz1z3$<*IYb=JgvkF>L`R_zj@6oSAk%h6zT!6(eg$nkELhLVQY;fGEy31Wo2M#Vr1AUELgs8Zn65TQ!6GPSy}vVVL4Z3t(t8hx2J7V)CK8F z+4p(OYi8G!+jriP`!t*P*13DZb}#LIiB9O`t;<=)ajnl}#T20}DVHr4BtDb8b+Nzu z?Em+{|M$+D^wD@{WX#_Nc7yhLH#BbA53Qg&RbR;sl+%;JBmS8l%5`NVsF-ab5Lks8z#>n|jDPBt-Weio-xYQ{eG lGz$fheSP}DR_*#mOVgJLrNu@S{@eJ*Mo&oLm@oqv003u1F_-`V diff --git a/build-system/fake-codesigning/profiles/NotificationService.mobileprovision b/build-system/fake-codesigning/profiles/NotificationService.mobileprovision index a0f5e98ae38936a8f312f1d07428043557d96fd7..84546fe604c632d92615d05afa681e60916476e0 100644 GIT binary patch delta 1581 zcmdn1a!7T;N;i-b=QT1iG%z+aurx3#JIH3o4Fpj;B|H54`w1UZtMhbwq8x1fj$F>aX5 z$*Wku^IFaR>;KB5rzqZ1aNTpZ<@M1N&sT~e$5bUN*B)+Ynp|8^RoWQ8qo{PT*=p6R z=N~>@x_-}!swB4m>_^!+S8m+gVtcIr?1Q;UJIW7#yejxb{gBqdN%4&~k#FCbMDq6V zYG2tAJ%@SKN6nIuDf(;g{c!rcR%EZDd*tE;6jS&5t(m{~}^_eKk=Z7xys9JIch&$iTQb(ja`YF`s3C)>osY4(29CMux8Qb2zTo$TyW`T-f9Kc7NlUXJ6+v?_GcPT*i#9E3&=O z_ccV#om@T%&DOoYr8&hk_Ci`hga4}M{VpuhUB9Qa7tWr&^vVN?!(TIts4$&zrD2Q;azT(O?EuShxGmLUs!U@*LKa1 z(pSM9U%owjz}|GxE?UFt@yfD;uK5i84-79#eCg6(|AWWs!}%$aU!$g$E^EAdXJ6UY z{;z!#=d6s5@sLB(W0Be%aaw(;D(^zIXbO@HF^ ztU^Z?nL{tbmTmZ0v&j6f!TyMatj)e53*tqm88iADHZgqy=An0>>{CWT%60W|o6ILD zXhuxp1=+>P#;VQ7%p}Fiu%L-CaPnV%?a&1ZUr&pD3FkhweNx}A6O;Gs-&gs=ps|&W zQ=5&Eg|W$8fW@$aWH*9xbr!LXYHVlYh87^40!-Y76$?lW5|DMoWne`?v3gOSwCjvk zPp55-J~nxC;R)Vjkx8}|4?_Li*S2g|l#A~Dv!azzMQU2d^+4;}PHF|GuFWdb;N#0P zn_1g&Z$k6EJvJ|w*EtGN5P`mSEq;S92 z&$AC!_{7TO-16LbY%9y2%`st`>#p^j7pyToUDFV}(9%ug`f~TF%atFzjO#Qq71G-m zaqw@z%~}!rQx;3+yq?mNDZc)P*4(EjdH$V`G}$}*4WC@m?wIoXZ0DK8{?|QmRMq~T NoOGWfX*~lN003@6byolY delta 1438 zcmX@4x>sexVnzW&T|)z1BeM`gb1M@AD`V5mn;D%r1dI@(h6Yv!2Af&A@)#LSCYNxl zs#qGC7?_(T8|WG&87AtQBqgTmS|+C$=o%UsB%7p}8zd!~SWe!{?H5~Y(8Qc?(8LtJ zfSHMriHVWXfR~L^tIebBJ1-+6H!Fidtf8fWIU92*3p0;_V?jYqs)9>qaY<2TQfWzM zex8*=NNP@MdQoDof?JfXkB_s0hO?QuvzukGNm!`nUFm3 zvcGRJ5&V7eNur-{rm=eF9-&y*2~3$xnJ){^Ppz1u#b$6nZ*owQv{JX6`oyU=t@TZD z6}|3@&#LTNVj{Doqv^W)b?5Mz4fSHNwiksrPY&3(yQGQh&evb;XI?*kf7ol+^l5Id zQ|!F2|Ec#AGCs3%3S&vxeuL~E^*zhn_Z^w@YFYRS^OrwfH{KWHpOvIJ>F|q5H+W>N zTjk^gx4t>c*(kwW)4gQ+S<$_^R(H8>B|Hq!;yyT&iJ6gsaj}(w#pGx{%X-wPWNu<) zWLR_J#WuZ`eYV_U8ZYk^t-UjAwaUG&rOQ_>TsJrFP^fp%^W|v|+?)2!<5yarkv^}_ zL#57db;JIVV%9ib#)u-g8`@VY(MVHN@gqnuRAlobBV;aE1KTY zCw|NDz1z3$<*IYb=JgvkF>L`R_zj@6ocoKBMW1bxd4k{3Ki@Rh1g%r#tqH1oB~YT zhA9gu_gOu}WTZ62%F4jf#K>S9wac9^BWX(jf7bH_{s$}z8@Oh$MwTrsKXbRa+~7iM z_Q8MG?L*(Lihp|YmHqz*xh88C+O~Q=F8|DH>iV|%{ohF&4h5?nHP`T6Azo+7bTo0H z`=z(y0fwb7m({I%8h7LJYXzUXo?_1RSx)T*;Tz6en{!w*bK<7sZ+~2gFlo8)F}LL& zub07s{oagz{Ep%5OKh&sl@8N-ex!cURZ}IwsNMkA&8Ey(ia58F1RwKSIepDv0sWl9 z+1%5%UA_N3fq%t~#K31V=ZxB7@;>d}GJj2G;$M@42@l;HyYiQ_SL{FVMQF9n<275V mCdeslEPJ+hNu22d*$1fxo)2y3t+eBt?9#}w=(jQh7ytm)TsJ-d diff --git a/build-system/fake-codesigning/profiles/Share.mobileprovision b/build-system/fake-codesigning/profiles/Share.mobileprovision index 636d4658e044082788ed23fe9d47708b42ee2990..c15af3868cd6171c7c5bf891fb0c5594808ad123 100644 GIT binary patch delta 1568 zcmbQNGDCI4R7L?KT|+}%1H%wQb1NfLD^sJ*OBqc#1dMeJ4RnpnLkumg49%=ej5ojJ zOkiX*nC!)^s$!ICU}RxrkgS_%YHF%$Vwhy9YiVh2u4`gqXk?aXWN4CTm^^thx1awm zgC^!}22D)!7BDk0GBE-5^RjVjwRyCC=VfH%W@RuaG}JcGWMd9xVdhcF49LjOOI2`5 zElbVGFGwx2QV34XNmB^UOwUVA0Sf2lPfid}sCRTVR4|Z(8^g&cCYS=0b0|s8Nlh;N;i-b=QT1iG%z+aurx3#JIH3o4Fpj;B|H54`w1UZtMhbwq;j(~^?F>aWA zpGUEN=e3&s*Z-AAPf@(3;JW8*%j=^lp05-`j;Tsku07n)G`YB-s6s z&p&*+bp4(cRY`3B*^jbuuH3k}#r9bL*#~ozc9b9fcvbL=`XQ}@lj0j~BHz9lATQh&}$=z_J zg161{LvzR4O}c`KPc!;lvp?CpCtd&FKXG?hMR97vy~lyCcFvhq(S&(PCiRHSzs{A^0A1qh|G3)Sj#RG^P%st z!cC)VCqk!PtgoKz$R|?Yb$$-V^&0u6vWyFRT;J|*JoD`9yym^@&z{Se(RD?(H~PMY zsJWBNC!yK8_qQ~sn8sd6OK9+4^}OGOMY`+vl=i~ev$x($)oOk|{l&4PPtI#e+|}8# zMDzmd?4!(A0xc9HALt*@%6-@wvUS5@?YEcqJiN=TvdNCe_>jK;{R>O3`P$a6`BC~R zxZ}&WhY#4BF4{$FSUp}@cF;ASq5py5MTsw6`s;u2SbaD@Me=LZ)Y4^*ckk>g+uHxN zZ{nPl(J>wpOXlo!db-h@`GL&ul_^sN8I|9=H$6G5a^&`x#x|b2m)?D1u<1{Ho>l0` zB6H|v*s={DYZjURHP|1qkhR%2WI?>>G-EqPf5RrGPryv`4wPTYNKC4rEMi7X@&p;q z$;PV9$IK+f%CMk`F>vx_e(lg#(pT7{Z7RAA6Ycgr(hc8nVHr+puB*IblFlF@aVfv9dC-G%+&FWoxY5dHzp%TcF9s z5F;Opj%~{yXP@2PZ@iVSMPxxm^A#PDZ#?SB>%;RGeBAJ1OG5OHuiE@ak87708+EIB zzu14)ru$E4ecnrB?ag(E3JXj#x4l<8aQpCPQI0*g4i{hW3bc%9*t01(BCMc#<~rA; zZErR%w!FaTy3c%nVu26S{$<~HY>E}A58eOp`F*dBC!X(P*80CRyzu_Eh_$&80 H0~i1RgUfY; delta 1438 zcmbQCI$34IR7L?qT|)z1BeM`gb1M@AD+ANbOBqc#1dI@(hCoq+%`Z6<7#U3_dvU9( zm?l}InkOb%>Y68|n&_ICB&XPkkF$b?vzfWGn`N*`Sg7V?10IF=&|m{Oab6<>LjxmALvv$e zL(3>}USnh~#da`-22W<^Rjj|GBd<5LVq@Kz%n$Ex-k5Y^qo?`iX_KA`Cq-$;tUF}9 zCTH@48Hmxbr2R!q@iGq|5OIVee5sasBc;#8Z~`lh&w zUiZakRdy{gky+Bwblv^BbNI}Lda+pBi^7{H2khHj(!_P=>o4{*uOGiZ?6qt9G`H6& zcHYCAr@pM!$m{6xDMvQ6z53!C^Owm}BXmhv#O_G(d+k#C91H7KwmB8fE_raa@ZE%6 zOMfp#|57gH#M%6Z&{LN zZItex`qHoD$-G0?me*fB-SW_|&R*iWx{dY0fKz$4ANOS?vz7nXof+S`MB>{OO>gNF zzh(H|?OXS9)wyN!`VE_ywg40S22fg0qB!Y^ga(5Q;$&mh=3{1(Vr5v+#Hc=5Pe40K zPD(;z^IqRTo&S6NwM$EH1g>dxG$>@_)MjI3VQexNU@=Ugg8iWo`-|DQp_!IbfQj2M zWdY?rtB073l!jPY8CaSa8Fos1`4M|=_S5t6n~nFi{FS!}Hi-p`$phAc zK?w>U{Mswo-&CD&o~E0b)2^Pj&n)-Fr@&Bbo#vQK-nazp)Np1(iZUAtU74}E*P{9lU2_NQg@7**K3-*!LU z?=xko;haNzHVf=Mk*-)<+F1DeebmaeM)vn-$vm3u$lsg5+1}nZ6+uu_7#_$dYe|0)BCDxc~*nV)mt&YSoI&?vbw^`v?+S;^-sR*#mkGu k6BI5u27Tr=2vS{me3DW&Z^ea+-OG;L3@s1-SH%DZ0GAv!x&QzG diff --git a/build-system/fake-codesigning/profiles/Telegram.mobileprovision b/build-system/fake-codesigning/profiles/Telegram.mobileprovision index 534e1305d53eff717188429fcc785748caecca80..b43d591cb0392399d5f289e6622e318546506a04 100644 GIT binary patch delta 1724 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 delta 1438 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 jaOnzraNF;~g zvHfR1%Eq~Jb{Jkf4!<7o&HqQ^u9cwq~ z3MM|y=yT2fWbdAI{eS<&-C-5QsR{QU2fo@lXR7u3n@?h9NmxeUu=$F z%e#K(8F$)ICT2zk#>J5a;gh-fEbC=~!6?heBE}*z+u>m?yG+c7zQ+nTjjo*top!Ol z+JF}xt&H5P49rc8j0|1p=WtxFk#8!?xUk3d?f%9y&%VxU-n;(nxr`ZIS7dvm?`w#f zJGp!knyq_(OLK~8?1i+12LDyh`(0S1yM9k;FPuGl>%CO1=I7I296S1?{=AmNU7amU zL@%(;KFWM0&_Xftf&Kxl+=rbZTQ?lmetT)p!@Jxno9uXu59#~gzp&(*ukD&2rLTfJ zzI=Q5fW7IWU9^VPD?y=oBqV-S%r=) zGKXG~9)`TLZ9dLcy0HF;;I(8Mk(gzk z=k1o*EY4}G@A&dZOV*@(s_e1XAMDrdp7wEp&a-Yg{)b0&zvT(Ohz=0yD1SUbt7huz z>l+;Q1RM?tRku%lwA!ekH2muo`==A5{yb@Z$~Ij?MYGByUC&^@w*3q{3Dpj#iL%#T z9hHBR_3L5ec0+I8;==xmxgEk?50j#58?NbX>iM(J;a#KMVIe((56y`s*Y(=hE()4? Oqo`}**|Gu#FaQ9EI(16` delta 1402 zcmbQGI#p%ER7L?qT|)z1BeM`gb1P#@D`S(*OBqc$1dI@(h6Yv!2Af}TCNeUbO!nbc zRY^8YG_K(_ zzFhjv*}~mby)3V6^5UiLET6Sv`qaj=$u(i6QN7jcY}aLf-(n*8`{I*CKjBPc^~^m& zv91%CGMO@87M`D4F-42b;C|lZpd@LfZaMXdQ*B!7o8l^Z-4~x#*|o$(W=TiWb@%Je z;WHcR#bRwQ3U8hquy1!s6W5)uzu3>be*FHh*RJW)++L^Hd0+oi?+?{lbL7}l zU)E~mb#(cZBOBUYeesR?%jBsMx+E-Occl2eb}4<1g>@_2oC;@`JUCnUZo;mmKbyS$ zjwM%5w5-3`sMLM^@}0)=$@4BM9<__uX2=%sNaCehL2Xk`b#s4r=gvDlQ&(o**4-+T zZ1Ux&(}DMo?&j}0q1Ap$uc>LB^^ua2_V{Uw-j=T2dGDv=g3pPY8rRCVEJ?FAO7~BF z=~wb(-l1#D>#v?}d1zQ?FL7Pn#`<8usXW_{`?8YR%Kz)mjPG0`@$HJHxAckMGJNm$ zt$VrZ+_HK7hD}UcfT?=}6C1J(3xh&7PHi?u7RDxX0T#m)D%c+ivA>v&8yeG`0!-Y7DGMm~ z87NcL35wMpl}us_*WdJgH*^2A0KU|xyoM&t6Q^bde_8!VCSj6{N{rW(=Qiy@tJ8YU zJ=4qe6E1()_2%M~pL^6LWVlK{D*fLX$SK);$}wO!OGVe5AD;52mFBS3{ z9bMS4lxLT*%AFa1w$>bWcprE1%!KZR+hP|zharUwgdmV1OFRNkHe6z%?xaG=~ zv%SuJ@t)6%FYeUp$f(u~JN9