├── local_manifest ├── prebuilt │ └── prebuilt.xml └── opengapps │ └── opengapps.xml ├── src ├── gpgkeys │ ├── E09EE26BC29C13C520C097E827C85CFCFAD4F2B8E09EE26B.gpg │ ├── 47A0B99EE6E0512B1829A92528CAFB50B60ABDD447A0B99E.gpg │ ├── 9AB10E784340D13570EF945E83810964E8AD3F819AB10E78.gpg │ └── 9AF5F22A65EEFE022108E2B708CBFCF7F9E712E59AF5F22A.gpg ├── patches │ └── android_frameworks_base-O.patch └── docker_entrypoint.sh ├── Dockerfile └── README.md /local_manifest/prebuilt/prebuilt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /local_manifest/opengapps/opengapps.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/gpgkeys/E09EE26BC29C13C520C097E827C85CFCFAD4F2B8E09EE26B.gpg: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP PUBLIC KEY BLOCK----- 2 | Version: GnuPG v2 3 | 4 | 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 50 | zw== 51 | =/ELK 52 | -----END PGP PUBLIC KEY BLOCK----- 53 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:17.10 2 | MAINTAINER Stefan Bossbaly 3 | 4 | ######################################################## 5 | # Volumes 6 | ######################################################## 7 | ENV SRC_DIR /srv/src 8 | ENV CHROMIUM_DIR /srv/chromium 9 | ENV CCACHE_DIR /srv/ccache 10 | ENV TMP_DIR /srv/tmp 11 | ENV KEYS_DIR /srv/keys 12 | ENV LMANIFEST_DIR /srv/local_manifests 13 | ENV LOGS_DIR /srv/logs 14 | ENV ZIP_DIR /srv/zips 15 | 16 | # By default we want to use CCACHE, you can disable this 17 | # WARNING: disabling this may slow down a lot your builds! 18 | ENV USE_CCACHE 1 19 | 20 | # ccache maximum size. It should be a number followed by an optional suffix: k, 21 | # M, G, T (decimal), Ki, Mi, Gi or Ti (binary). The default suffix is G. Use 0 22 | # for no limit. 23 | ENV CCACHE_SIZE 50G 24 | 25 | # Sign the builds with the keys in $KEYS_DIR 26 | ENV SIGN_BUILDS false 27 | 28 | # When SIGN_BUILDS = true but no keys have been provided, generate a new set with this subject 29 | ENV KEYS_SUBJECT '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com' 30 | 31 | ######################################################## 32 | # User Id 33 | ######################################################## 34 | ENV USER "root" 35 | ENV USER_NAME "CopperheadOs Buildbot" 36 | ENV USER_MAIL "copperheados-buildbot@docker.host" 37 | 38 | # Apply the MicroG's signature spoofing patch 39 | # Valid values are "no", "yes" (for the original MicroG's patch) and 40 | # "restricted" (to grant the permission only to the system privileged apps). 41 | # 42 | # The original ("yes") patch allows user apps to gain the ability to spoof 43 | # themselves as other apps, which can be a major security threat. Using the 44 | # restricted patch and embedding the apps that requires it as system privileged 45 | # apps is a much secure option. See the README.md ("Custom mode") for an 46 | # example. 47 | ENV SIGNATURE_SPOOFING "no" 48 | 49 | # Installs the PICO variant of OpenGAPPS 50 | # Valid values are "no", "yes" 51 | ENV OPEN_GAPPS "no" 52 | 53 | ######################################################## 54 | # Build Variables 55 | ######################################################## 56 | ENV DEVICE "walleye" 57 | ENV BUILD_TAG "OPM2.171019.029.B1.2018.05.15.17" 58 | ENV BUILD_ID "OPM2.171019.029.B1" 59 | ENV CHROMIUM_RELEASE_NAME "66.0.3359.158" 60 | ENV CHROMIUM_RELEASE_CODE "335915852" 61 | ENV NUM_OF_THREADS 8 62 | 63 | ######################################################## 64 | # Create Volume entry points 65 | ######################################################## 66 | VOLUME $SRC_DIR 67 | VOLUME $CHROMIUM_DIR 68 | VOLUME $CCACHE_DIR 69 | VOLUME $TMP_DIR 70 | VOLUME $KEYS_DIR 71 | VOLUME $LMANIFEST_DIR 72 | VOLUME $LOGS_DIR 73 | VOLUME $ZIP_DIR 74 | 75 | ######################################################## 76 | # Copy required files 77 | ######################################################## 78 | COPY src/ /root/ 79 | 80 | ######################################################## 81 | # Create missing directories 82 | ######################################################## 83 | RUN mkdir -p $SRC_DIR 84 | RUN mkdir -p $CHROMIUM_DIR 85 | RUN mkdir -p $CCACHE_DIR 86 | RUN mkdir -p $TMP_DIR 87 | RUN mkdir -p $KEYS_DIR 88 | RUN mkdir -p $LMANIFEST_DIR 89 | RUN mkdir -p $LOGS_DIR 90 | RUN mkdir -p $ZIP_DIR 91 | 92 | ######################################################## 93 | # Install Dependencies 94 | ######################################################## 95 | RUN apt-get -qq update 96 | RUN apt-get -qqy upgrade 97 | RUN apt-get install -y bc bison build-essential ccache cron curl flex \ 98 | g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev \ 99 | lib32readline-dev lib32z1-dev libesd0-dev liblz4-tool libncurses5-dev \ 100 | libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lsof lzop \ 101 | maven openjdk-8-jdk pngcrush procps python rsync schedtool \ 102 | squashfs-tools wget xdelta3 xsltproc yasm zip zlib1g-dev cgpt bsdmainutils lzip 103 | 104 | ######################################################## 105 | # Add PGP Keys 106 | ######################################################## 107 | RUN gpg --import "/root/gpgkeys/9AB10E784340D13570EF945E83810964E8AD3F819AB10E78.gpg" 108 | RUN gpg --import "/root/gpgkeys/9AF5F22A65EEFE022108E2B708CBFCF7F9E712E59AF5F22A.gpg" 109 | RUN gpg --import "/root/gpgkeys/47A0B99EE6E0512B1829A92528CAFB50B60ABDD447A0B99E.gpg" 110 | RUN gpg --import "/root/gpgkeys/E09EE26BC29C13C520C097E827C85CFCFAD4F2B8E09EE26B.gpg" 111 | 112 | ######################################################## 113 | # Install Google Tools 114 | ######################################################## 115 | RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /usr/local/sbin 116 | 117 | ######################################################## 118 | # Set the work directory 119 | ######################################################## 120 | WORKDIR $SRC_DIR 121 | 122 | ENTRYPOINT ["/root/docker_entrypoint.sh"] 123 | -------------------------------------------------------------------------------- /src/gpgkeys/47A0B99EE6E0512B1829A92528CAFB50B60ABDD447A0B99E.gpg: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP PUBLIC KEY BLOCK----- 2 | Version: GnuPG v1 3 | 4 | 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 86 | xDvqpA== 87 | =V7B8 88 | -----END PGP PUBLIC KEY BLOCK----- 89 | -------------------------------------------------------------------------------- /src/patches/android_frameworks_base-O.patch: -------------------------------------------------------------------------------- 1 | commit 4e9d677b35b9656c22c922c9abca4107ab95c9b4 2 | Author: Bernhard Rosenkränzer 3 | Date: Tue Aug 29 00:34:27 2017 +0200 4 | 5 | Add permission to allow an APK to fake a signature. 6 | 7 | This is needed by GmsCore (https://microg.org/) to pretend 8 | the existence of the official Play Services to applications calling 9 | Google APIs. 10 | 11 | Forward-ported from https://github.com/microg/android_packages_apps_GmsCore/blob/master/patches/android_frameworks_base-N.patch 12 | 13 | Change-Id: I603fd09200432f7e1bf997072188cdfa6da1594f 14 | Signed-off-by: Bernhard Rosenkränzer 15 | 16 | diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml 17 | index 794d4f8b78b..b3189077256 100644 18 | --- a/core/res/AndroidManifest.xml 19 | +++ b/core/res/AndroidManifest.xml 20 | @@ -2075,6 +2075,13 @@ 21 | android:description="@string/permdesc_getPackageSize" 22 | android:protectionLevel="normal" /> 23 | 24 | + 26 | + 30 | + 31 | 34 | diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml 35 | index 3613acf44aa..d1636c862c5 100644 36 | --- a/core/res/res/values/config.xml 37 | +++ b/core/res/res/values/config.xml 38 | @@ -1385,6 +1385,8 @@ 39 | 40 | 41 | com.android.location.fused 42 | + 43 | + com.google.android.gms 44 | 45 | 46 | 47 | diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml 48 | index 3eebe7eb68d..7405386cd49 100644 49 | --- a/core/res/res/values/strings.xml 50 | +++ b/core/res/res/values/strings.xml 51 | @@ -764,6 +764,10 @@ 52 | 53 | 54 | 55 | + 56 | + Spoof package signature 57 | + 58 | + Allows the app to pretend to be a different app. Malicious applications might be able to use this to access private application data. Legitimate uses include an emulator pretending to be what it emulates. Grant this permission with caution only! 59 | 60 | disable or modify status bar 61 | 62 | diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java 63 | index f36b762c5e9..048a057d39c 100644 64 | --- a/services/core/java/com/android/server/pm/PackageManagerService.java 65 | +++ b/services/core/java/com/android/server/pm/PackageManagerService.java 66 | @@ -3571,8 +3571,9 @@ public class PackageManagerService extends IPackageManager.Stub 67 | flags |= MATCH_ANY_USER; 68 | } 69 | 70 | - PackageInfo packageInfo = PackageParser.generatePackageInfo(p, gids, flags, 71 | - ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId); 72 | + PackageInfo packageInfo = mayFakeSignature(p, PackageParser.generatePackageInfo(p, gids, flags, 73 | + ps.firstInstallTime, ps.lastUpdateTime, permissions, state, userId), 74 | + permissions); 75 | 76 | if (packageInfo == null) { 77 | return null; 78 | @@ -3584,6 +3585,24 @@ public class PackageManagerService extends IPackageManager.Stub 79 | return packageInfo; 80 | } 81 | 82 | + private PackageInfo mayFakeSignature(PackageParser.Package p, PackageInfo pi, 83 | + Set permissions) { 84 | + try { 85 | + if (permissions.contains("android.permission.FAKE_PACKAGE_SIGNATURE") 86 | + && p.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1 87 | + && p.mAppMetaData != null) { 88 | + String sig = p.mAppMetaData.getString("fake-signature"); 89 | + if (sig != null) { 90 | + pi.signatures = new Signature[] {new Signature(sig)}; 91 | + } 92 | + } 93 | + } catch (Throwable t) { 94 | + // We should never die because of any failures, this is system code! 95 | + Log.w("PackageManagerService.FAKE_PACKAGE_SIGNATURE", t); 96 | + } 97 | + return pi; 98 | + } 99 | + 100 | @Override 101 | public void checkPackageStartable(String packageName, int userId) { 102 | final int callingUid = Binder.getCallingUid(); 103 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CopperheadOS-Docker 2 | Docker container for building CopperheadOS. Still very much a work in progress 3 | 4 | ## Enviroment Variables 5 | 6 | ### `USE_CCACHE` 7 | Enable or disable using `ccache`. Can significantly speed up later builds for both 8 | the CopperheadOS and chromium build processes. All cache files are saved to `CCACHE_DIR`. 9 | Defaults to the value of 1. 10 | 11 | ### `CCACHE_SIZE` 12 | If `USE_CCACHE` is true this variable determines the size of the ccache. 13 | This value should be a number followed by an optional suffix: "k", "M", "G", "T". 14 | The default suffix is G. Use 0 for no limit. Defaults to the value of "50G". 15 | 16 | ### `SIGNATURE_SPOOFING` 17 | If set, privileged apps will be allowed to spoof their signature. This is needed 18 | for packages like Microg or FakeStore to spoof being Google Play Services or the 19 | Google Play Store. Please note that there is a security risk to setting this to 20 | "yes". Defaults to "no". 21 | 22 | ### `OPEN_GAPPS` 23 | If set, the `PICO` [package](https://github.com/opengapps/opengapps/wiki/Package-Comparison) will be included in the system image. 24 | Defaults to "no". 25 | 26 | ### `DEVICE` 27 | The codename of the device the build will be for. Currently supported is all the 28 | Google Pixel devices (sailfish, marlin, walleye, taimen). Defaults to "walleye". 29 | 30 | ### `BUILD_TAG` 31 | The release version of [CopperheadOS](https://github.com/CopperheadOS/android-prepare-vendor/releases). 32 | Defaults to "OPM2.171019.029.B1.2018.05.15.17". 33 | 34 | ### `BUILD_ID` 35 | The Build ID of the build. Defaults to "OPM2.171019.029.B1". 36 | 37 | ### `CHROMIUM_RELEASE_NAME` 38 | The Chromium release name that is going to be built and included in the CopperheadOS 39 | build. Defaults to "66.0.3359.158". 40 | 41 | ### `CHROMIUM_RELEASE_CODE` 42 | The Chromium release code that is going to be built and included in the CopperheadOS 43 | build. Defaults to "335915852". 44 | 45 | ### `NUM_OF_THREADS` 46 | The number of threads/processes that will be used during the various stages of 47 | the build. Defaults to 8. 48 | 49 | ## Volumes 50 | 51 | ### `/srv/src` 52 | Location of where all the repositories will be downloaded and built. 53 | 54 | ### `/srv/chromium` 55 | Location of where the chromium repositories will be downloaded and built. 56 | The chromium prebuilt package is no longer provided and we will now have 57 | to build it from source. 58 | 59 | ### `/srv/ccache` 60 | Location of where the ccache files are saved for both the CopperheadOS build 61 | and the chromium build. 62 | 63 | ### `/srv/keys` 64 | Location of where the release keys are located. If the directory is empty the 65 | script will generate keys for you based on the `DEVICE` provided to the container. 66 | 67 | ### `/srv/tmp` 68 | Location of the temporary directory. 69 | 70 | ### `/srv/local_manifests` 71 | Location of any custom manifests that will be included when syncing repos. 72 | 73 | ### `/srv/logs` 74 | Location of where the stdout and stderr logs will be saved to. 75 | 76 | ### `/srv/zips` 77 | Location of where the output `*.zips` and `*.xz` files will be copied to after the 78 | build process is complete. Will include the target files and packages derived from 79 | the target files (OTA, Flash Archive). 80 | 81 | ## Example Commands 82 | 83 | ### Basic CopperheadOS 84 | If you want just plain CoppperheadOS just provide the enviroment variables. 85 | 86 | ``` 87 | $ sudo docker run \ 88 | -v /media/hdd/copperheados/src:/srv/src \ 89 | -v /media/hdd/copperheados/chromium:/srv/chromium \ 90 | -v /media/hdd/copperheados/ccache:/srv/ccache \ 91 | -v /media/hdd/copperheados/keys:/srv/keys \ 92 | -v /media/hdd/copperheados/tmp:/srv/tmp \ 93 | -v /media/hdd/copperheados/logs:/srv/logs \ 94 | -v /media/hdd/copperheados/zips:/srv/zips \ 95 | -e USE_CCACHE=1 \ 96 | -e CCACHE_SIZE="70G" \ 97 | -e SIGNATURE_SPOOFING="no" \ 98 | -e DEVICE="walleye" \ 99 | -e BUILD_TAG="OPM2.171019.029.B1.2018.05.15.17" \ 100 | -e BUILD_ID="OPM2.171019.029.B1" \ 101 | -e NUM_OF_THREADS=8 \ 102 | bflux/copperheados-docker 103 | ``` 104 | 105 | ### CopperheadOS with Microg 106 | [Microg](https://microg.org/) is a FOSS implementation of most of the Google 107 | Play Services Libraries. Most importantly it supports GCM and Account 108 | Authentication. Inorder to support microg `SIGNATURE_SPOOFING` patch must be 109 | applied. In addation `CUSTOM_PACKAGES` should include `GmsCore`, `GsfProxy` and 110 | `FakeStore`. `FakeStore` is needed since most apps that rely on Google Play 111 | Services will get upset if they don't see an app with the `com.android.vending` 112 | package id installed on the system. 113 | 114 | ``` 115 | $ sudo docker run \ 116 | -v /media/hdd/copperheados/src:/srv/src \ 117 | -v /media/hdd/copperheados/chromium:/srv/chromium \ 118 | -v /media/hdd/copperheados/ccache:/srv/ccache \ 119 | -v /media/hdd/copperheados/keys:/srv/keys \ 120 | -v /media/hdd/copperheados/tmp:/srv/tmp \ 121 | -v /media/hdd/CopperheadOS-Docker/local_manifest/prebuilt:/srv/local_manifests \ 122 | -v /media/hdd/copperheados/logs:/srv/logs \ 123 | -v /media/hdd/copperheados/zips:/srv/zips \ 124 | -e USE_CCACHE=1 \ 125 | -e CCACHE_SIZE="70G" \ 126 | -e SIGNATURE_SPOOFING="yes" \ 127 | -e DEVICE="walleye" \ 128 | -e BUILD_TAG="OPM2.171019.029.B1.2018.05.15.17" \ 129 | -e BUILD_ID="OPM2.171019.029.B1" \ 130 | -e NUM_OF_THREADS=8 \ 131 | -e CUSTOM_PACKAGES="GmsCore GsfProxy MozillaNlpBackend NominatimNlpBackend com.google.android.maps FakeStore" \ 132 | bflux/copperheados-docker 133 | ``` 134 | 135 | ### CopperheadOS with Google Play Services 136 | If you are a complete newb like I am and aren't ready to give up the Google Play 137 | Store and Google Play Services, then simply mount the `local_manifest/opengapps` folder 138 | as the `/srv/local_manifests` volume and set the `OPEN_GAPPS` variable to `yes`. 139 | 140 | ``` 141 | $ sudo docker run \ 142 | -v /media/hdd/copperheados/src:/srv/src \ 143 | -v /media/hdd/copperheados/chromium:/srv/chromium \ 144 | -v /media/hdd/copperheados/ccache:/srv/ccache \ 145 | -v /media/hdd/copperheados/keys:/srv/keys \ 146 | -v /media/hdd/copperheados/tmp:/srv/tmp \ 147 | -v /media/hdd/CopperheadOS-Docker/local_manifest/opengapps:/srv/local_manifests \ 148 | -v /media/hdd/copperheados/logs:/srv/logs \ 149 | -v /media/hdd/copperheados/zips:/srv/zips \ 150 | -e USE_CCACHE=1 \ 151 | -e CCACHE_SIZE="70G" \ 152 | -e SIGNATURE_SPOOFING="no" \ 153 | -e OPEN_GAPPS="yes" \ 154 | -e DEVICE="walleye" \ 155 | -e BUILD_TAG="OPM2.171019.029.B1.2018.05.15.17" \ 156 | -e BUILD_ID="OPM2.171019.029.B1" \ 157 | -e NUM_OF_THREADS=8 \ 158 | bflux/copperheados-docker 159 | ``` 160 | -------------------------------------------------------------------------------- /src/gpgkeys/9AB10E784340D13570EF945E83810964E8AD3F819AB10E78.gpg: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP PUBLIC KEY BLOCK----- 2 | 3 | mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV 4 | lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7 5 | 8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD 6 | u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z 7 | wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq 8 | /HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5 9 | jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4 10 | MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9 11 | b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv 12 | aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k 13 | cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX 14 | gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI 15 | 2t09Ed+9Bm4gmEOJARoEEAECAAYFAk8rWocACgkQflcKb7vZf3DSMAfw807lt3kB 16 | ETJEqLcN34CtlUmHBokhR0+oAZBETXQJH+jcRsJkB9HHDWXllI7wbaqdmOjZohpD 17 | LtMhHFGDctO+Og5ruF7t5xBLk/RcsW37xgH1BeIDxabKCgtf9K2J2hHzOzszZAHW 18 | 71J4buSuM65NCBBTWqXBfDPuNEDJbaXahK1PUl0wq8N60VVOgS/3AyPT/fG8BQA8 19 | we6RXa3KJxefmr+Kz9nlwT3K0KJnDP2URt6wV/fcKSvLInQZyOKEo469qBQ8R0CV 20 | mjvUlHKBwdZWfcuVHsWc9J2XtAFl+sjTtzWW5cTxz0znAsTvRgjL58NMdvQ7tDQq 21 | aiAAg/TXvh6JARwEEAECAAYFAk3g17sACgkQBtcaJHhTLpK3wAf/UbnQ4BGr0jM/ 22 | T99d2L2QJdvgp0tWdBDgtaygoGHg1KkvOXfoxnHwusOnYY7YEQT78+OEQ8aNJ/cC 23 | nQJOYslIdspu0MGR2dfTUmt3kaSIWyqJMx4B0aegdhI9d0k3q8x3fAjUxxgjX7UC 24 | FfGFmEo22F4IIeok0jKo45nApyebYBVh1frKBWFzXfO+RRT0OKN/be9vvnvetz+w 25 | FWl0RO7LJ9Nc0ppnNXwfVza47GdVo/qALf1US1DYrM2wk6VjHtX228Nmr1LKmf+S 26 | z/tV4FViWGq9WlNj6Uh+QAVIf2IjhQuxCTmiug6X8JQTHYtoehFzv8uV92+fdtnD 27 | C7fiw1kYiYkBHAQQAQIABgUCTgdcKwAKCRAIPxjLYonA7x+MCACvs5sp+1l4NZgi 28 | 8dpBp0Gyov3HOrg1OSmCu+39A2WqPRRzthTa1py/XWNVk5bjt8qRWKGCWmqZLXsX 29 | Qn0dkrywm3xgPUsj33wWG7O3nD0lrxoAWY1uhhKDl/u0MbEZxEqxqjV7eZfqQ70u 30 | FXhOPUgwGMO4d+EMTuZVzEsV5jEsff+bZ442d1pFzkVAQoct36UWUkC93Qp5mfPy 31 | JfdIvmxINywqIuEAdwQjDFQD7Xuwv0Oo7GJM8ezEo0BbBtHh3tK2xC8nTmE9sywR 32 | 0j/w1lDUOj57D+oghbriNFgyrlyP9CJCvkF87ztdcVsRlmBg+FKVWfawCblVscfl 33 | mbvSvreBiQEcBBABAgAGBQJOSkydAAoJEDHLT54Lm9cnEJUIAKqdeU9d7w/uAIUh 34 | EJhKUJt8WrkJqimhq2Eu3Vv5US2N3YiqpbmXAv8znovEoc3UV1oqABLchn0qFH/e 35 | rM6dE5+BNAPs1j+NSvPMXVJWPHqtRwfdfyrklj/sPRRpZ/+y9x+q9Qy8v5XT/nOc 36 | bfEHtC7ndttHmIlCu9hUe3imUpEAkq+YDKTKFfFP1hjBCENgALgeOiKgfVCWZPMe 37 | gcSqe/juPMSTpIlfEEE/iMOpCfggJ/oYgU+WL4C4gGPYxApLS1wwV8VSe2SsMkv1 38 | 1L7Z7IJ99wNcarSCVFakKQM5YAkuUw83rcqnGWwJitPJxP1EA/epuvldsgx1ZUoI 39 | XHgxXfqJARwEEAECAAYFAk8sq9wACgkQuGDzbqssiNYG/wf8DZk3FJqnLjZlcGWx 40 | LlSdbEomKWZonBRcSo6BK2mnjmHqgXpjdQsVWPPNECzU+bpRQ1TYzIF/jg3GJTvu 41 | Rms3BzAQkB2zkVBxOiA29Yfl83yXio+gNqFETrquHJC0SdlT2y68GFcJaZDF0seH 42 | /LcfbtkBSuBlrFQJBGryQXznb6V949q23v3OPOMBPQsQC9Zp6wEuDyWJ5FEH9AVu 43 | JSwn1C0Cze7D22MpCpL4uyjQoVfvWcBECPNL6m0FCJjv4vtDkdIgLU2fYxHaQCWE 44 | FOZKui9ubhFGMnV9P38aSWh/BDEbzt6myIdquqF0UxjcgggEzgYJYiDfLpkWV1GW 45 | aDRd8okBHAQQAQIABgUCUjTN2gAKCRAB2Ha/gb70OTU5B/9gZ17Hyj9hW1cYeC8h 46 | pQHmWMkwISg7jRMv2CAhGHkhV6gA5Ih7fiBYECoiT1tbgPy8Tv0dCRbM0J/66mUH 47 | +ayXe6J8avRRFQ58iAUuMJFi61DdA8RWDKqlTuMLHjXfdFvqoLb7hMRmN+wDEzbF 48 | EXqKuixUCvm6VDrghqqJKyTh5IDI79wXp9AZQeQp64qB4KCdbJaA8tqNa+uHDTwR 49 | i8IcJOjGspfLfJR3aJl2+41mYSt+uXHqzrm4d9IPYSXdDadSiZFjlhrSX6qHNgMx 50 | d4yZ5jDBZpIVtwVEfiphZR42kTHBe/8ZECXki/cUW7kOWs7RZXGbtuQxuiFKEl/I 51 | l9WxiQEcBBABAgAGBQJV1seqAAoJEPI2qVPgglpt0KMH+gPX3eg4k3HsPmqtTJe2 52 | mDMdUWBA/wAKSvumqJLA5iqxmlrRIG1kwhvwUDcb2d1sDOUTfZMZA5y70zM4YQs3 53 | XRF6Eq5ilEBXuBPjhZFGjOxq1+8iISUPL+muE3FbqxEiCqIGer19TOGoYqrIhldD 54 | LB+6lvvcLlNBklab0mCLTTlI2HmvyMa9VB5vK1HYuTS6qPX8lVlgBQUwK7qqIyhQ 55 | yRt722mRUuqEoA7teTL3MjotVwsDN+mfLZKYFK3xrP5tLre3IvY1GcUeS+24SXT0 56 | 9MmKQvTGwFeOt87bQ195YMFbndeFn1V250TQsyBz4mRTcW2oCpe5yIzeESN6DBvE 57 | /VGJAhwEEAECAAYFAkxky7QACgkQUY7XLW8Lox6wFw/+N6N4FiuDwhWLAA9YABdK 58 | rOqIWGXzk8d0jtf3kOBTTz/kxyGTusX5ZjWCuWnwARPqLlTFt5sqNiG2H17bFw05 59 | LBu1574SEHIABEgTDAxgSwjjH1Tf1zlCUE7aLKbajaLTeR88XdRA4cq86lcH5jdd 60 | foChpJb4t4FEFGLQ0qAkdLztdkEzNwu0cokz1j0fhNeb/E8I/cIQgZp/AnMIDZ/+ 61 | IU5/xJjlKDiBYi98HnDJj8wKJL5fwDrNCODiUoVwl+X2iyzFWhdGfGSpyauzhnqN 62 | jyIHxNroY7EjVkQSWCp+3Z/SKzGEbc94evvHDrG/4xqSjqS6SSJSYgfOxFIzBiym 63 | z4G0ARe59C5JbPr8wwBxtSE9EwRrznnkixwTEV/jf6pjcq8SS5XmTwBKrrqtW9TB 64 | 5I3TCUcFpJCGgPjphiaQt+JJsg1dPMrzWZ+OOiRE1ofDcFI5ZQpq6GNQjM/gGSHL 65 | obfEQVEhvD158Bibtsics24mnG7Xn6jJobhYYFcjJ9iQ5wp8HZBozgZZxIxFaEal 66 | +CP0ZNe1uYUNI+t5p7CGVg8Pm+5xs2X8YrL+7iM6es5RU4zUbv/ZF8dwoGEFxVAX 67 | K/gDYh/wZeHATVBC5RwN76dD4FoO94PtonoDjeGU1XfK7eMwknbHY398Ji3bdNKz 68 | DQDF6+662M6y3XFfl3/NBmKJAhwEEAECAAYFAk7a3IMACgkQyoq6kVk0inourQ/+ 69 | MSInmi98PgASnEsSmYtik6XTUFWU0yv9siQ0w0jlBy6t/y4PA48aqpDYScEJRnIt 70 | p8qeSAdkSPxIUbModarKV36Q1r7Xg2veUiZJV9lm6fTfLqKPL8dNldM1NqDSXhB0 71 | lsIFwsfoto0bUpj3f31wACPueW4ihWvt+fW9AZJuaQvVTIMBuUftdUYYw15mAKHO 72 | rpdSOqvMsQmyeVazPNZlp+ss/F6pDhQ3ZlgExxwPg72cYosvZvHR33FSITa+sLJl 73 | zBYNRNqYGp/xPCcKUYgmCR3Mzuu/5kuFcI2NZMiHEL/+ZdUr1YQt88EWTcS11UAP 74 | qr5I6KfGQEQk5jnf2hD5vYYCAFF99NsmnV0FSq3ZQ8eoaA5TmfldoIJ8w/IcknLI 75 | WeR/pWSYXZCeaXKujYMs6RISlQ6mHWUAsuRD8WKboOIUMVUtj3IC5MR06I//ccGy 76 | Q245I16QRMTKR0jST4F56Bg7dIGcg/TtQWxJ2no20Bl3vL3DAYZ9MQVo2JVnK6By 77 | KzE+dV3pIxh4YWXv+/sdPsT7FBT6MELJ19iIlsc1twGFTpyMxKk7UoyylA2qLvMQ 78 | QMwDOieZahpAERAAFsvz9L3tJ0hUu+qtEt62kaUTVbRuyH2d1OOs1RP3QAjKm/ta 79 | 56iQclGM9Hx9eeeCBX7gnpYT/oRvnhMNRRLRZcLRszKJAhwEEAECAAYFAlBDKssA 80 | CgkQdAczx6Yd6jG3qBAAqCyft16p+cq6sohdv9edPvOBxB21xQ6jpPpxq1TQBH+S 81 | KLgnPYyS8SpiLF08WZt7o+S/1dWkNQPhfpHkIx+M7enotQi37d8/AIfXPQk5TyhG 82 | P7Guozvv+cy/YAB8tDFdPSHiPQEUNfB61YB72I1QbdG+f6gX40lwDkS8xExje2h6 83 | Y+hJJNsFa0IJE0nQVl4DMGInvPgBG/b9FlOcR0v1qySwyhYFi6eb8vbl56DUGUXu 84 | R0kj6MsVBj6xoyNYMrdW77ex2IM7c8jV4FksjhFmZUhToQ6gLjAm24qETez50HRn 85 | QTbyXK6/aPhJ+oltEsdXHNQC0YIBTc+/utJtPSd3nhL5M2Gyvrg3IqiHIyvLCKdT 86 | 9rR76LWBC8o3LeMiWv94NiD6+KBh5jiLyV7DrwuU3l82ETvbSNHRBRBQ4hIEnfQC 87 | L/gNIwwAzL+2B3QE3gAQQBnUi/0mR3Q6NsSTwjDZlLlDb/oGNFzPrbxwnoHHBQLe 88 | TENFClLD/zL6DlsaboFnWENnXgUCoLt3YhLxpSUOeqYspZha6Z40TsOW1FHE4c88 89 | 1X8wz9HxCRI437/visxknRzlzUjYBdh2ybx0Kh79DbZMvdctz3ruXyPqWSjkR4V7 90 | TmvRHqxPOGJSq9dI8zzWRdEzLhIbD2iNbwgdU7WLCcgiY4lYk/tbN8sF/127OS25 91 | Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAlQN4mWRhfzDOk/Ros 92 | db0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806UphisyEmmHv6U8gUb/ 93 | xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbkC2b1TvVk9PryzmE4 94 | BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMXLWBGWE0znfRrnczI 95 | 5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+OgTg7Cow+8PRaTkJ 96 | EW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/MpK+KMs/s3r6nJrnY 97 | LTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7sKZ8laHRARonte394 98 | hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phbN8bTyOJo856qg4oO 99 | EzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjAvUXRwm/fFKgpsOys 100 | xC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwoG1S8fXgE0Lq3cdDM 101 | /GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQhN0DlsIw8hqJc0WI 102 | SQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0lEXzeoxcdoafxqf6g 103 | ZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM= 104 | =BjoK 105 | -----END PGP PUBLIC KEY BLOCK----- 106 | 107 | -------------------------------------------------------------------------------- /src/docker_entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | # Setup global variables 5 | BIG_BROTHER="" 6 | if [[ $DEVICE = "walleye" ]]; then 7 | BIG_BROTHER="muskie" 8 | elif [[ $DEVICE = "sailfish" ]]; then 9 | BIG_BROTHER="marlin" 10 | fi 11 | 12 | NOW=$(date +'%Y-%m-%d-%H:%M:%S') 13 | STDOUT_LOG="${LOGS_DIR}/stdout_${NOW}.log" 14 | STDERR_LOG="${LOGS_DIR}/stderr_${NOW}.log" 15 | 16 | # We only support the pixel devices 17 | if [[ $DEVICE != "sailfish" ]] && [[ $DEVICE != "marlin" ]] && [[ $DEVICE != "walleye" ]] && [[ $DEVICE != "taimen" ]]; then 18 | echo ">> [$(date)] Currently this container only supports building for pixel devices" | tee -a "$STDERR_LOG" 19 | exit 1 20 | fi 21 | 22 | # Initialize Git user information 23 | git config --global user.name $USER_NAME 24 | git config --global user.email $USER_MAIL 25 | git config --global color.ui false 26 | 27 | # (Re)Initialize repo 28 | cd "$SRC_DIR" 29 | repo init -u https://github.com/CopperheadOS/platform_manifest.git -b refs/tags/${BUILD_TAG} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 30 | 31 | # Copy over the local_manifests 32 | mkdir -p "$SRC_DIR/.repo/local_manifests" 33 | rsync -a --delete --include '*.xml' --exclude '*' "$LMANIFEST_DIR/" "$SRC_DIR/.repo/local_manifests/" 34 | 35 | # Clean out any changes 36 | echo ">> [$(date)] Reseting repos" | tee -a "$STDOUT_LOG" 37 | repo forall -c 'git reset --hard ; git clean -fd' > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 38 | 39 | # Sync work dir 40 | repo sync --force-sync -j${NUM_OF_THREADS} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 41 | 42 | # Verify signatures for all repo tags 43 | echo ">> [$(date)] Verifying tag signatures for all repositories" | tee -a "$STDOUT_LOG" 44 | repo forall -c 'git verify-tag --raw $(git describe)' || { echo ">> [$(date)] Tags could not be verified" | tee -a "$STDERR_LOG"; exit 1; } 45 | 46 | # Ensure we have the correct keys 47 | if [[ $DEVICE = "walleye" ]] || [[ $DEVICE = "taimen" ]]; then 48 | keys=(releasekey platform shared media) 49 | else 50 | keys=(releasekey platform shared media verity) 51 | fi 52 | 53 | # Check to make sure we have the correct keys 54 | if [[ -z "$(ls -A $KEYS_DIR)" ]]; then 55 | echo ">> [$(date)] Generating new keys" | tee -a "$STDOUT_LOG" 56 | for c in "${keys[@]}"; do 57 | echo ">> [$(date)] Generating $c..." | tee -a "$STDOUT_LOG" 58 | "$SRC_DIR/development/tools/make_key" "$KEYS_DIR/$c" "$KEYS_SUBJECT" <<< '' &> /dev/null || true 59 | done 60 | else 61 | echo ">> [$(date)] Ensuring all keys are in $KEYS_DIR" | tee -a "$STDOUT_LOG" 62 | for c in "${keys[@]}"; do 63 | for e in pk8 x509.pem; do 64 | if [[ ! -f $KEYS_DIR/$c.$e ]]; then 65 | echo ">> [$(date)] $KEYS_DIR/$c.$e is missing" | tee -a "$STDERR_LOG" 66 | exit 1 67 | fi 68 | done 69 | done 70 | echo ">> [$(date)] Keys verified" | tee -a "$STDOUT_LOG" 71 | fi 72 | 73 | # Generate avb.pem and avb_pkmd.bin for walleye and taimen 74 | if [[ $DEVICE = "walleye" ]] || [[ $DEVICE = "taimen" ]]; then 75 | if [[ ! -f $KEYS_DIR/avb.pem ]]; then 76 | echo ">> [$(date)] Generating avb.pem..." | tee -a "$STDOUT_LOG" 77 | openssl genrsa -out "$KEYS_DIR/avb.pem" 2048 78 | fi 79 | 80 | if [[ ! -f $KEYS_DIR/avb_pkmd.bin ]]; then 81 | "$SRC_DIR/external/avb/avbtool" extract_public_key --key "$KEYS_DIR/avb.pem" --output "$KEYS_DIR/avb_pkmd.bin" 82 | fi 83 | elif [[ $DEVICE = "sailfish" ]] || [[ $DEVICE = "marlin" ]]; then 84 | make -j${NUM_OF_THREADS} generate_verity_key 85 | "$SRC_DIR/out/host/linux-x86/bin/generate_verity_key" -convert "$KEYS_DIR/verity.x509.pem" "$KEYS_DIR/verity_key" 86 | openssl x509 -outform der -in "$KEYS_DIR/verity.x509.pem" -out "$SRC_DIR/kernel/google/marlin/verity_user.der.x509" 87 | fi 88 | 89 | # Initialize CCache if it will be used 90 | if [[ $USE_CCACHE = 1 ]]; then 91 | "$SRC_DIR/prebuilts/misc/linux-x86/ccache/ccache" -M $CCACHE_SIZE > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 92 | fi 93 | 94 | # Do the inital fetch and setup of the chromium build 95 | if [[ -z "$(ls -A $CHROMIUM_DIR)" ]]; then 96 | echo ">> [$(date)] Doing inital fetch of the chromium project" | tee -a "$STDOUT_LOG" 97 | cd "$CHROMIUM_DIR" 98 | fetch --nohooks android --target_os_only=true > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 99 | "$CHROMIUM_DIR/src/build/linux/sysroot_scripts/install-sysroot.py" --arch=i386 > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 100 | "$CHROMIUM_DIR/src/build/linux/sysroot_scripts/install-sysroot.py" --arch=amd64 > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 101 | fi 102 | 103 | # Sync the chromium build with the latest 104 | echo ">> [$(date)] Reverting and syncing the chromium project" | tee -a "$STDOUT_LOG" 105 | cd "$CHROMIUM_DIR/src" 106 | yes | gclient revert --jobs ${NUM_OF_THREADS} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 107 | yes | gclient sync --with_branch_heads -r ${CHROMIUM_RELEASE_NAME} --jobs ${NUM_OF_THREADS} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 108 | 109 | # Clone or pull latest of the chromium patches 110 | if [[ ! -d $CHROMIUM_DIR/chromium_patches ]]; then 111 | cd "$CHROMIUM_DIR" 112 | git clone https://github.com/CopperheadOS/chromium_patches.git > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 113 | else 114 | cd "$CHROMIUM_DIR/chromium_patches" 115 | git reset --hard > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 116 | git clean -fd > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 117 | git pull > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 118 | fi 119 | 120 | # Apply the patches 121 | echo ">> [$(date)] Applying chromium patches" | tee -a "$STDOUT_LOG" 122 | cd "$CHROMIUM_DIR/src" 123 | git am "$CHROMIUM_DIR"/chromium_patches/*.patch > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 124 | 125 | # Generate build args and build chromium apk 126 | echo ">> [$(date)] Building Chromium" | tee -a "$STDOUT_LOG" 127 | cd "$CHROMIUM_DIR/src" 128 | if [[ $USE_CCACHE = 1 ]]; then 129 | cc_wrapper_arg='cc_wrapper = "/srv/src/prebuilts/misc/linux-x86/ccache/ccache"' 130 | else 131 | cc_wrapper_arg="" 132 | fi 133 | gn gen --args='target_os="android" target_cpu = "arm64" is_debug = false is_official_build = true is_component_build = false symbol_level = 0 ffmpeg_branding = "Chrome" proprietary_codecs = true android_channel = "stable" android_default_version_name = "'${CHROMIUM_RELEASE_NAME}'" android_default_version_code = "'${CHROMIUM_RELEASE_CODE}'" '"${cc_wrapper_arg}" out/Default 134 | ninja -C out/Default/ monochrome_public_apk > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 135 | 136 | # Copy the apk over to the prebuilts and archive directory 137 | cp -f "$CHROMIUM_DIR/src/out/Default/apks/MonochromePublic.apk" "$SRC_DIR/external/chromium/prebuilt/arm64/MonochromePublic.apk" 138 | cp -f "$CHROMIUM_DIR/src/out/Default/apks/MonochromePublic.apk" "$ZIP_DIR/MonochromePublic_${CHROMIUM_RELEASE_NAME}.apk" 139 | 140 | # Select device 141 | cd "$SRC_DIR" 142 | source script/copperhead.sh > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 143 | choosecombo release aosp_${DEVICE} user > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 144 | 145 | # Download and move the vendor specific folder 146 | echo ">> [$(date)] Downloading vendor specific files" | tee -a "$STDOUT_LOG" 147 | cd "$SRC_DIR" 148 | "$SRC_DIR/vendor/android-prepare-vendor/execute-all.sh" -d ${DEVICE} -b ${BUILD_ID} -o "$SRC_DIR/vendor/android-prepare-vendor" > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 149 | mkdir -p "$SRC_DIR/vendor/google_devices" 150 | rm -rf "$SRC_DIR/vendor/google_devices/${DEVICE}" 151 | mv "$SRC_DIR/vendor/android-prepare-vendor/${DEVICE}/$(echo $BUILD_ID | tr '[:upper:]' '[:lower:]')/vendor/google_devices/${DEVICE}" "$SRC_DIR/vendor/google_devices" 152 | 153 | # The smaller variant of the pixels have to move their bigger brother's folder as well 154 | if [[ ! -z $BIG_BROTHER ]]; then 155 | rm -fr "$SRC_DIR/vendor/google_devices/${BIG_BROTHER}" 156 | mv "$SRC_DIR/vendor/android-prepare-vendor/${DEVICE}/$(echo $BUILD_ID | tr '[:upper:]' '[:lower:]')/vendor/google_devices/${BIG_BROTHER}" "$SRC_DIR/vendor/google_devices" 157 | fi 158 | 159 | # TODO find a better way to get rid of the double talkback dep 160 | if [[ -f $SRC_DIR/vendor/opengapps/build/modules/talkback/Android.mk ]]; then 161 | rm -f "$SRC_DIR/vendor/opengapps/build/modules/talkback/Android.mk" 162 | fi 163 | 164 | # OPEN_GAPPS takes priority 165 | if [[ $OPEN_GAPPS = "yes" ]]; then 166 | echo ">> [$(date)] Adding GAPPS into the build" | tee -a "$STDOUT_LOG" 167 | # Special case for walleye (also known as wahoo) 168 | dev_name="$DEVICE" 169 | if [[ $DEVICE = "walleye" ]]; then 170 | dev_name="wahoo" 171 | fi 172 | 173 | # Add GAPPS_VARIANT += pico and call to vendor/opengapps/build/opengapps-packages.mk hook at the end 174 | sed -i "1s;^;GAPPS_VARIANT += pico\n\n;" "$SRC_DIR/device/google/$dev_name/device.mk" 175 | echo '$(call inherit-product, vendor/opengapps/build/opengapps-packages.mk)' >> "$SRC_DIR/device/google/$dev_name/device.mk" 176 | 177 | # PRODUCT_RESTRICT_VENDOR_FILES needs to be false 178 | if [[ ! -z $BIG_BROTHER ]]; then 179 | dev_mk_name=$BIG_BROTHER 180 | else 181 | dev_mk_name=$DEVICE 182 | fi 183 | sed -i 's/PRODUCT_RESTRICT_VENDOR_FILES.*/PRODUCT_RESTRICT_VENDOR_FILES := false/' "$SRC_DIR/device/google/$dev_mk_name/aosp_${DEVICE}.mk" 184 | else 185 | # If needed, apply the microG's signature spoofing patch 186 | if [[ $SIGNATURE_SPOOFING = "yes" ]]; then 187 | echo ">> [$(date)] Applying the restricted signature spoofing patch to frameworks/base" | tee -a "$STDOUT_LOG" 188 | cd "$SRC_DIR/frameworks/base" 189 | sed 's/android:protectionLevel="dangerous"/android:protectionLevel="signature|privileged"/' "/root/patches/android_frameworks_base-O.patch" | patch --quiet -p1 190 | git clean -q -f 191 | fi 192 | 193 | # Add custom packages to be installed 194 | if [[ ! -z $CUSTOM_PACKAGES ]]; then 195 | echo ">> [$(date)] Adding custom packages ($CUSTOM_PACKAGES)" | tee -a "$STDOUT_LOG" 196 | sed -i "1s;^;PRODUCT_PACKAGES += $CUSTOM_PACKAGES\n\n;" "$SRC_DIR/build/target/product/core.mk" 197 | fi 198 | fi 199 | 200 | # Apply FDroid patch 201 | echo ">> [$(date)] Adding releasekey to the FDroid ClientWhitelist" | tee -a "$STDOUT_LOG" 202 | key=$(keytool -list -printcert -file "$KEYS_DIR/releasekey.x509.pem" | grep 'SHA256:' | tr -d ':' | cut -d' ' -f 3) 203 | sed -i -e "s/67760df25e94ae6c955d9e17ca1bc8e195da5d91d5a58023805ab3579463d1b8/${key}/g" "$SRC_DIR/packages/apps/F-Droid/privileged-extension/app/src/main/java/org/fdroid/fdroid/privileged/ClientWhitelist.java" 204 | 205 | # Build target files 206 | echo ">> [$(date)] Building target files for device" | tee -a "$STDOUT_LOG" 207 | cd "$SRC_DIR" 208 | make target-files-package -j${NUM_OF_THREADS} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 209 | make brillo_update_payload -j${NUM_OF_THREADS} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 210 | 211 | # Link key directory 212 | mkdir -p "$SRC_DIR/keys" 213 | ln -sf "$KEYS_DIR" "$SRC_DIR/keys/${DEVICE}" 214 | 215 | # Generate release files from target files 216 | echo ">> [$(date)] Generating release files" | tee -a "$STDOUT_LOG" 217 | script/release.sh ${DEVICE} > >(tee -a "$STDOUT_LOG") 2> >(tee -a "$STDERR_LOG" 1>&2) 218 | 219 | # Move archives files to ZIP_DIR 220 | echo ">> [$(date)] Moving archives to zip directory" | tee -a "$STDOUT_LOG" 221 | cd "$SRC_DIR/out/release-${DEVICE}-${BUILD_NUMBER}" 222 | cp -f *.zip "$ZIP_DIR" 223 | cp -f *.tar.xz "$ZIP_DIR" 224 | 225 | # Build is complete 226 | echo ">> [$(date)] Build is complete. Enjoy!" | tee -a "$STDOUT_LOG" 227 | -------------------------------------------------------------------------------- /src/gpgkeys/9AF5F22A65EEFE022108E2B708CBFCF7F9E712E59AF5F22A.gpg: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP PUBLIC KEY BLOCK----- 2 | 3 | mQINBFDA2AIBEACZPA2Vh++ReD7AIaACsJ5K0QAzCo/si4B9+2tfZ9lhFIHP2zGa 4 | YedqLSLTd07qplTpoxiE8vgCRgx3nCHk9f2HqYOCoUJrX9J0mMjPUtH5DAuuDC6t 5 | Q6fhbFvBRwr6EfRKk0qFwHogOvMpzm9SH4ucTUvlElNv1GqweJF4W3Ooy4TINk0Q 6 | vcKznJnQxf9QO//1/vtUFPR2r55sGdJYusCa2HltRfVvVuD5PpVPqf+t9AmXeMOH 7 | dYXakMOBsr1XKsOGgnw35CjtC9hk0158uGjXN2m4Gf8KmjPmJ7DWsBV32f81/DeW 8 | cf7B/tOjb6h4CkeXlAhx1Ta800l5C/oCyClHgNpmR79/D8wcFiNgLgNWDdIOXZ8Z 9 | 2ibkOfAyvqM++lrjoG5dR+FHNYSoH98nPM4+/2EGCAcU+oF5ZgSrAPwuUI15Wzov 10 | c47v/Y+kaMTN88H/Xf4wjbYdAHE8XhZdqAOtq/jT2m8aJar+WqqTdYV8XnIfkz7r 11 | a4+sybEzjlkHb14gGmuUUTYj9gPpFRi717JBVpgVtcila60arJ6+cHW4BtF1abs/ 12 | YBr3L3cwlhu2eu2MmqWFlXXY7EwGI2ZqSfAGUjPoZHlXAJgG/Rzm47gQFf6dHgva 13 | tRycEqC5PZFdByJfTnz7SAU8AqIi2km94vxJp+cKoFoBDc6HTUUPTIAS6wARAQAB 14 | tCREYW5pZWwgTWljYXkgPGRhbmllbG1pY2F5QGdtYWlsLmNvbT6JARwEEAEKAAYF 15 | AlYmIQkACgkQHlnW+ljFN4XPgwf9FRhd/WwjAtsy+G1NWXNh5OzlK0a/rFgiD+Qa 16 | pvsiKuxJC8IyALBQV3S/Xc3q7EpFOYoNSieO5qMdpYmJCwgJCZRaTg+CZrAvgPEY 17 | 6uMkD2ATSW3dEQkvuqS0xuOfKfkO1j62H02hdtyuGGyF5Mydg38F+Sto0PkO09JJ 18 | qFtfvhknX/EmT3Cd5KrcI3pqS31PPNqYpbtXf151BKSIdGGyhgGQ5xZW2dd540Ei 19 | 6mxf0lOyZilxl+7ktyXm/7ArSRDa1tEkQIxcdG2magUnxrQcD3dG5BqFGOG35UK7 20 | Ioiwh43ib6R6jeZuoy4EZ4+q98SkAnb8ABvHwqqS6my1gGLecokBnAQQAQIABgUC 21 | UOXwpwAKCRB+/VZ9TH6oh5cVC/93PSPOqtTgoQY+Qkb7pp1K3KWZz17M4j6o3113 22 | qe7xjFcYdRMuS0PEPTYdThwIxM8C0466Qp4j9qt3INNrxzuRpQqJlwYtuYEZzAY9 23 | h7enVS5JS99wD92RdVrpF3M5wkZG8ojlaaDWuRgUvqLOHwxEjzQw5EPadgw0WY1q 24 | 7+XaoXQYxvxVR1+bBDtaOdboMCiVaLY4SHoW92mDa398Tt1Ft2PL5S1QXXnUH8YG 25 | KFv7USr2FCa9ekt8PiphGuPh2mkFIMoaUvwepOyBSxwD2+F+GUdcSJyW98fX3Pf6 26 | GsIMZj7SmAl6AkfunzADZarRzdPW+X5FvvnDcBr7G7GE0GpuQS9y38CYHz8RwkZX 27 | OiXhzJ/kmaDg+WOVn7bdk8uf+6nYNh/0rUeUzolG5A5mkOmmiBkwYPTxJjyytOII 28 | oO+6nJzRBmA0De1gNOrE5rjcLEY2WHoZhLKpUGcDrrSI7PILb583Y5A5irhrb1H3 29 | R9LHT527U9yq18vdlTMaW11hFTyJAZwEEAECAAYFAlD0DZYACgkQM0iIL2rGpMK2 30 | nwv+K2YnBQxYTU0R8UvKpcIRIGSPth/sRZw/9IYSsYlZvR7AGVLZhvO6S+EeTmd8 31 | 16macE+I5fiK7Va8h8Nz32TwC/2QKPLaV/bJvh5/RFg2g4WRME2QWhllVZfmvW2u 32 | 19JxOHLBiuUcyaXaTgABqVjdO5U0WstesjmMICcfylmtwwMKWpfSL5fG5lXlmrA5 33 | JW4H8Xh9VO7Zx3fbQ0sCI4XA37DbUTaaVPvVj+/0nhxWIIdDj2xiA4vLB29EIBso 34 | g2z3e7nHKxvwa+Tk3Qr7+e7BLo17SyIMRws4SwaXfbqG2ERIv7z709V9BjISqCkx 35 | YWO41bIDUZieSdGD/IlcnocsKgcsvtuIHiIgC7Wirp8a6E0wXZCGZ/ECf4lMpZlQ 36 | l1F9+tBIuCFcb3W9U5yJ3+iYMVus39tJZrvLBzP/R1nH26cIJdA5ELo809OZtBRh 37 | aBtEgCIfw3XPcEnFeIcIbwMm2wMuPRuCYHnyw3l7rFrlKObTJqPl3RCAPGdBYSFr 38 | 9711iQGcBBABAgAGBQJQ/DqjAAoJEFGEJS2CSxjoxbcL/0mG8aihTCkNJ+jGsXWy 39 | lH8BsVjyRxRUOrU43Pm+xmzmj8NJ6o8YfYaEwnhk5lSNLXpbuzUqGeiixmY1H8Y3 40 | 9imvEY2MLcK2RhijtZkzg/BBlyz7UfxPy2zk6//c3ga4rqkuAbS0KI7xA2bziyU3 41 | 8qs+P2ajkElnIOJhfwBCAL4U5xFHrsBjhmeyGZ9VVuf+eWrC9NJ0vdG6vnDDlSm5 42 | d42vqR+KRFObIESvPX/V49tnl8V18Sh88U0oYrFBydIGkjGoK1tJe4sXCs2gM3bx 43 | gmYj61l19IOHWlBo3EaE8SSKUdHHnxAfe49LLtqgELusKEa8eHVqvWkS2XsEnQIV 44 | 0ePWvceKvr54vddrEfe2xnVQzsWaVlj7RCyq22pJwV0xaeeFziLl1/EaxazCB1Og 45 | zXt1rW8gtlOEj6Wwl24EKc9Wy45nreMxuyL4VoehUt3x6gGuAC8blzS/sQnWDUZX 46 | Jdiou+MpVwdtBdnGa/ZnUh7PsjNL6WwPbq1pUoVulbx1jYkBnAQQAQIABgUCVAUH 47 | QAAKCRCgT5OXzf1rsHjMC/4qBrac/ze759kASbSwLF3R/ENS7KZM2cAqh64ZtsJ0 48 | Nugow+9i8cRnQ40eSy3Ms3sHxFQsBK4ISirwmtv9xRJFX6dZJD3vIZEZLJFVp3nV 49 | LFCLi+ldlJDQbyysxFlRNPAiFEpeczYWtE54M060CywV51v9AsfiqVo+HjAJ+zEp 50 | 52V6lo+e/1LT+Sfv0PigF3TeitXggtsl5LUCGP5DlBRICY8YqK2VLHrbPN1Yig+f 51 | S0OjWKcDop4gp4jvJ9TPR5Qyn0tRMgZzj21vnuzC2AYehVkW9awo0sbkEYOxCUEb 52 | 1OeGU2C+04puo61PZFBRjcOCTVNOOQ5Ksm1wWyJ96gdRhxHGQK0frWu4O1IiWbun 53 | jmezWV2KWXRHo6NBbpYyupQxpWBytNc6nU4MkOJPb1i1MjCjvejD4KjhPSnCIK6G 54 | fr4G+5qHFihgqCguS3FHvXiZ0n8cAZRiPNVBqSPdZYBIBncORn6oZXBOe6zDYTuh 55 | x48QeFQnPc0ZJxRnfmqi3OeJAZwEEAEKAAYFAleMMMcACgkQg4ym5CXCTJVi3Av+ 56 | LCRfhfT9YQLB1LNBUuoek3G6yz4eHx9aONe8qletW7dFmDCDm0b86Da0AVGO4OPe 57 | V45sWrJ1qjU60J9s3KYzvUU2C6EIn61SOZEWMGUxEdlH6iwPFdP/ldFaDCP07vGH 58 | wMdnaRgngfWg+8sc5q74bjI052jQUx9QThbcVLCXwm2gGZKwB9p+++SEfkJk97R8 59 | ZhPoukMjRVy4uc8XQ6DIwuKrsvrYv9ftrR/ejxvPfuZpez4VkXwGUSmesQuoJ6If 60 | TXjvQ8aDc83/CCGfmgzlhvR+Wn4ymdSS39lUOKraI76CXW5HExKRf/ikHuA1lNNv 61 | KeJBZZ20zE5Up/q/MmWvoxVyeYJuUZZtCCXKl8nTU8+ifvJJKxra5CoKAxqFee5S 62 | luzvvan0TrbJ1YgMXM4jh/fYAVkrmQiVmZ568I9QedJEStwhXE3NhWu+8IsZYSIs 63 | TXRRtMB99VXSjUE8HE/K7mevu8RguDMEnVgYigg68SlgDOZRyRp2cvQq3LQrgiMU 64 | iQIcBBABAgAGBQJQ3FD+AAoJELod+2T/+XnnFMwQALTIrS1TkNin/ZQzilR7xfIh 65 | gm7HBbhuk5hY0DRdAIWV1jUd2V9gTJ6w4KFmye0SaTKxAt3ZBo+cXpQw3/a+qduq 66 | g/19cKtRxZLNDBkvVAOyLk2wtZBAdK8lpvvTPYPJ67mK0Tm3AL8MIAMtYBIXwc+v 67 | gK9SjU/MkYaffl1tf1awBfYYnIuXWtwz2M7sd4YpG2iXLJ1CR9U/omAkLO0Jk5+A 68 | o9XUtEU9usX8TaxkuybhHU2s52klR0ydmhOQoA+BajbL0gac8/dJib3vgix4u/dG 69 | zBme1nWVRJTmCjzYngyixqRkizwEJ/Z0zhFwg2a/DovUQapTZCSDWq8URFAlkHWK 70 | 6JYrmq32n2DqMmOLeXNVG1ZVDpbggaiYHQaQXvt3zKpkluS7mA1qfKjF/FaMXwoJ 71 | ek/jCL36RdgTLts01J9qGvjjtRjcT0Su8qaPfsZ9ckdozwQ/9c/jJ0hVUankMLr7 72 | ilpnHf4I+oecKkxNrxmjfQ4IrybfU8SQHXP+nNFSwq/MrP1JgR2uHj2THBe5L7t+ 73 | 2PM7gjfx9SMpTw6XM09pwukMI+COSAc7ePGznFbC8xHa65WKUleP93bZBim/ke+d 74 | Td2eDcMs/S9Opu4adDt1jqP39jjOUF9Dd13HMZdqWwpGOX77KINKSIXanEjI4Wja 75 | 9y1Ql02Z20pkfql5iOHYiQIcBBABAgAGBQJTRSb7AAoJEIcuZxTq9exE88wP/jwu 76 | TTyY9AyLYhZkhAhxZNT/DicnZjkylVF/uXs2+YgyGzC5vGPiJRiQVDZ1MQSryAAO 77 | K2jcb/KhZ/7Xa+WJg9R6NFeYhlfA7+C96nNdl0dYDthvTncXOuWP0ttkSctjIC5C 78 | 9NbF4yxOhChio62fi7PzvqOAoFpyMbMzHmeXCYv4UyW1HBedLgqb5EqYDfxX1xrD 79 | i6ytMgfAlOtxzLI8WMSC9qkQaTYe4VN3RiNt41hxhDbl270fKuS4DmfBW/96IpRk 80 | VgVX799iVNdKO/5lZMSNQsrS9tp7EqlConOUbf2hKKInMa68gPwf+fMsxfeRkMvQ 81 | MUoDiIppAxltiEyd0OxMcvoJnSwZNO/uateQgTuNOw2kX1e0XpzpuVkZoFQn0H38 82 | grKxYmHP6poFjmZ50KQIVnIBEulnjQIgFNOjF9qTVnKxgy4ZubKkUYqjsB2MSMt2 83 | 5FMP+7BaMvYWAbNWLC5U9FNpx0zTBk5hmfhiCUUFerCXVo3C43H3ZGeQaUe3bIl2 84 | 8BHMQeEH0Yxu6oEBM9D0WnLnf7NSYpkvX1yZuB6VCq8yCMR4gGjzZdkPkf3DJXeX 85 | 2s2JDbq/A9KNUU9lK4lvvzIKVWfiD+5YIiZrOJBOiX5GOOx+DrxseSIz36vMS/30 86 | 1RigAteNPkh1WJaWgFSuAOEiVrijA/p6C6QopTQfiQIcBBABCAAGBQJWeyUiAAoJ 87 | EKiOI+N3UU4ArUgQAMQQ1lincRlP6buJB/2uVlHG2sPu9bM20OQwMWXuZwATocyx 88 | bqe2z1kMAoxJF5TdaaMPqU3Lk89AcAYUK3ySzevQWJ3nblw4/pSFlrk2YU80M2pm 89 | QxugGnFu9NjduzRe2ydFt2gcEx6/xaa/MxXyjMcsWTWNnlnjWkpFdcZ3AQKYkV/h 90 | IKTmiXWZpszWBd/jGY2BMTCpD21WrK0s3Og4L86t2TK3zTeSqr/L037gFrlPCCJ5 91 | MhS2XrufEMPmH5oW/b7BtYAKMl710ieVwxEs2uikANnFRd8f4iogzHnKtAELnJcp 92 | mn8Zsn9ZL0GNXW4I0dbHXJ8VskW2GsWxt7NOvtyX65Ybb0w8E9dlEo/AY16jBJwA 93 | Vbh/17tAUpqHbVLcdddpzRjiVKM7YsCLqgOIEAXIjvxEvYbdvynqpOIB2ios58Xg 94 | oTSaZca3NeEWE3Ji12qe4O1h92EsXnC0rIbu0GpOFTAKWR3pQV6dl0qhQHU+1gHs 95 | tz2HX3ed3XlXtkEV5k7HF3LcdXGs2zJoM9vV73ToY8JOwbswCQyFZverppMrefH8 96 | JL9egL552bQDpa4zF8DZw97Q3RjvpDLl+8CqBvh8aDCxciDUI+EHxtIDhzhUrkSH 97 | ssbRCabXQPBshPP+80hDpubt9u785MpagWNkYJH/wgptvTyYrK7wcuZNc+4AiQI4 98 | BBMBAgAiBQJQwNgCAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRD55xLl 99 | mvXyKicgEACLv91WfennAD71gwqDboK/50GF+Gv3s/O/BGjRWMuN5sJ+c6Sm5vZ+ 100 | AXP1+Wjt0DKt3Cqx4hnucALGHT/cWagC0J4NGfCgtAhd7YgBHLSPLYIbkVkrebfU 101 | tpHw+nhL9zBdNqaO12cYF7hz1LlsSMhlLNw4jLA7dMkhA/1Ev9LJTfELvQPocj93 102 | M3iBipbljz4N9r5FHsR4Fj06OfX5BIjgcrQjzrefy1lt8K7kmgKOewDN/+TGYnSq 103 | UdsNvJ9VMEF1zMYjzSH4eW/0V0U7UyD1J+H6YQqZ42JEqbPhl2J8uXL75zcS2sd/ 104 | qNZe/Pkg9WoVCbUly6AjjJTcqZa+YBnTvRxo16nc+XB9kyDNBxkR6S9Y+BDbWepy 105 | 2iZ1YL4bsps6mN+uFlFq+8n5OOgm/eNqXzpBupZ+0i75sHY04XXQp7FesLf+CdgV 106 | s/TIk2WaeBB0EMdepVJeNLsOgIJz6dnlaVK9WUQiQmTueBIBMCqP0Zz3vvifyfOQ 107 | BIvmp/ckm4ie66hQ0xeo38pgH5qP8VttIrBX3j2trsVTdt68WFdaiEWT8r/xSlzd 108 | Iu0dNhS8LOB2q0eRpeEyoSpXoJIEtp47PbgM7QnfluqkVNGQpfR+MFWHGS0HM1AE 109 | RJ3r9Gw7PRRwUScMPfDAP/mh1ARqPppYcXH1MKRBDRNpNM2LBXz7k4kCOwQTAQIA 110 | JQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AFAlZ6OXcCGQEACgkQ+ecS5Zr1 111 | 8iqZ9BAAmN09RUNrRfdrASBUCTlsvcL0vhUE1rukCi2T3OBjkufalNhnUm6nNjJ2 112 | 8NI8BDKucyk5HvhH+xWFuAfy9j/67GuB60PKmSPtejq+ouYbXddf0BzghKneDVNq 113 | eaNn+TurVsPfOaCfVAHGNavBRn7OX3U2D3XGBMHwG12ebbiiN2ro/w9VGuUkjsOb 114 | yuY6W6oHoJ/ffoZbuW2tS4ZeN/WSLqIi5/01n7tUV+MlqBn45S23BSiCPMUdfk7C 115 | YuO3QBjUH/IaIgG/xoP4khEH+LXlLU1YF4BhjSdIpwNRURBSme503gYNKAL41OYn 116 | wcRonpABfu7Nlj1fp2wK988Gh6Yut+I0ry9xjWtGY3yidw+vIvG4hTcC2BGlv6cX 117 | QufUdxodznzg+IyziQrpKQiJP/PiCfrfzoNvMKLo/yXeUa1rwTHWm933dAYxcd0H 118 | bgoAHmz/Vjz93PBWPQzl6rQNKUS3vUtHCWNncUqYjrEuLo59+O8J80KrR1oQVvWU 119 | kl2Rqk6HJW95KT7GZ1jWe8XiMXH8q0l3SvO9SoPpcLaXxsx9kfAtXI4BLTDusYqt 120 | vp2vfsXxj64+3ki2XYbpZD8j84tQ+07egTu4xbiiSlAGdAEBldu81itqZe86hLvM 121 | L2v/wDFkxoiCpIes2GNJJDow+i/PS6I1kwewd+bcv43iLmI/OQC0KURhbmllbCBN 122 | aWNheSA8ZGFuaWVsLm1pY2F5QGNvcHBlcmhlYWQuY28+iQEcBBABCgAGBQJWJiEJ 123 | AAoJEB5Z1vpYxTeFz4MIAKYjwxhPOysmnT5T6qjbvk/TVKvtGcAEdWuG3yCeeWaf 124 | 1dv15eyYSdK5ATPt79EQ91p4/FGc2rCz1nvYd5fcy3baq2+I6dYtbO1Cwj5mpI5H 125 | fLL4B9qxNGW7IULVWlwxOG7df+DTo2/m3XcPcU1/It1fbHioUv8sKGtjmtLt+JKH 126 | Kq8Q+sgzXYZE2Gegdq1Ojq1yV8LDyoq5N1rn8ODXsSv3nP6sHkHk8BLzo/pv+thj 127 | BqMUD3tbm7CHkyxm6Hyl6NXiqu+Qs8+6V0r2CxcKsmW3huVF/U3YMBDs3zvaX44i 128 | quJ+yCzp4P/MJjqv4acIp8/g/1qln8vwueDQrDaKF4iJAZwEEAEKAAYFAleMMMcA 129 | CgkQg4ym5CXCTJVwYAv/TOJNOcQNZbkPhqHixJ2aJtBI5Jzzxx+Re5j5+FYuSJ6u 130 | c81AKOigWrYAHTJ5wx+3Q2UIC9NLI7w8bzAWKG4d7ystcIoMHznvZhOqTZhORFhS 131 | J81hQrrPhDpxMwivsWoLqNI0xVXlH/g+wfHxrsirYuAPVsqXRt54tRQqN0vtcV7S 132 | oIlveJpUnJAl++4U58dU5/wcxi8qIIrAY8qyvpDQDRF8vp4iommQzWHgq2nd8keQ 133 | HYqxMy0eo9K24JKBZA3IENxVVE4RA7QY0YaE+vT94sMp2bGfO8dZhuD28sHWARNb 134 | rUa5WLbbCW8uJneZnH+MT8A6xc7RbOEXsJQtHtj+YQryz/PuO6OfsLWa5umlxCbP 135 | H37yy4e9/wyR4ouZ0otSrzrARxrvJaaXv+fECUgEGTMekQ7EJ4GCEd6OaNeG30FV 136 | xt5s2MHavA/87bSu/qsN3XNajM6u8JOyKGuOlcLDuhPu/1AoKHHezCE6uoMqNqIx 137 | oqC8lh0wDKOkWpUmvrpUiQIcBBABCAAGBQJWeyUiAAoJEKiOI+N3UU4AL4gP/22B 138 | O/WWfquKPnbQO66RzDOPXJfcBrA/DnSSdHTk9+EtTggIFaHyzM+8Qyp0uPxRG72k 139 | 3NiwbpFmn3kcqUkCZFeR+7Kr5vKjJSfvUybSy3ktwoaDtXzG1t/3+cDye8lcpMFv 140 | +I7wGE9gkQkKXhoZaGecO7aSXEe+zS933v6O87EmfM7WGTTgsdrDMDryFWZknH1N 141 | pUddIEog1UfsTAXXfw3MKvjOqGcM4tlP7cHHI/OilDlTAH27E3rNTII6KYFGLt9g 142 | UxtPckdhdNttdTP5WP5Git2bL6uxoZzfC1RcAtIxmU5UEoZyPjMaNOQQYfMYhEuW 143 | I3WvfENLrifh0kVPGCYdZicjv5p8j16CaBiYg5oblivVYJFf2MjZUIizH29BEQmJ 144 | 2Fi5+cCMVA+k5Sr7uy3gfFlMXl/yQemqajGkwjOhhQwLs91xorQLTd1UaXldWSKd 145 | D09lwRKlmpb8NNMpiHzzYBEuK9lpFO/LrFj8EONfr26xSewoqoo8ikDJX+piqLCA 146 | Vl1X5J+QLjru717y5Nl3Vfz7VJrvTCEguADfmVBps7Pp4AvsCH4trgnIHyz09mZ9 147 | zpL9FT1tbOxUJjdJZHjnOkbCgIcfVQgPwFUAOkbWs2+g/nDumnZCh3Twu3B5CDqv 148 | /46SpEMWbN3mrsyjmEklikyB5IWb5997p+6LojOYiQI3BBMBCAAhBQJWAIPxAhsD 149 | BQsJCAcCBhUICQoLAgQWAgMBAh4BAheAAAoJEPnnEuWa9fIqEf4P/3pxM3kMb86z 150 | DcML0FjqM64W1cokHX/8CNCp4OEa0q7PtOSRjO/rXo0/2DTFiJBpb3TfkkivxN5y 151 | GPnonH/2TlS+TX3DxvNqCPf/pGVAen3dxxAkjYox0E2v2ibm++zhuNUaq1Hi+H4E 152 | 4kwO2N057WKrnE8KqYU7lWEVEuYnwj7NfqJcrlPgV9zM0Th1lwcFXyxCF10NRyQS 153 | d6dn1ddXw7jVL418oyl2vx9VKmg+16VespDR184Gxnnd90fwmcxcNADUOyP7vrKL 154 | PlE9YwzZvJBUe5mgVHsJnlljXEBHPou4b9fZ/0xaTJv/OXvPGZIe+OQ/3oRjmjhD 155 | H0gMPusHi2nh0gwBt89mGgwyrINgygGgvdJdeQf4kYLCyaYOc/BinxyLeQ/e82mq 156 | 1cZDVYS7la08ihqeM6KaMlm6nrX0UGovREOWOgfPI0vjji8I0aeZDm3JbGrSl+X1 157 | TbKy0tZACLoTF2fR31NWDhU/fIyPa4zbQVZ6MhrqPjTaw5Pug0+Rb1vQZlEjwjLr 158 | mGM9CJbdJ5NOVIXojmcHDi9JE+7p5Vu6eiaYEOY/OiPWB8i5tLRaLLrAVy0cQ0YO 159 | a1+WOU1htGMSZyFLL+4Zfewb4sh3DJXYsETAfQmbuBA6yeDGmTopVrnGGdKR9akS 160 | Wu4xkAStZAxMA//FohiEo306liChwTI0uQINBFDA2AIBEAC0oXladWvp3oLQZyox 161 | XHFv3m8GXKOHeEziNMNZtMMM0vSudacQ61oSgfjN1Ff6qmtL64sZWG65BZ/NucuU 162 | 695V9Qy+deY333zKNYUvohlJjwxsG4QzK89NP2apViVS3qPFD4XLEB7IIabkUlmz 163 | HiiUTqBb5ApJf+GABPpPOmVcG3x4HwKkwpsr7burPO457ZjyKubR+2qOIbXCg5iH 164 | OU2M9tmMzgeVGH8xbkdXAiQ6zzqBvQoudgnmQ9kP1X1udHEckpu/eWegrZ4zBg5U 165 | YXySXwQQa5md6qXcAiaBxItRmdksJNt8j+DKu1AOcxNPPIJjkfZTdyQ+eujuDtbr 166 | qVjD5iF6wa4kMzxjwo8tSzoXrRLZOhJLmr8dN9cnaXuaWGc2U7XsjO2h8WPYJDeM 167 | PXUGF32dkbSfyolf+y0+3pd4bdvnyMthSsC/wFzRCKJz0aGUzErMFFb0J8IOtXvb 168 | vExPMmzdMk9oLVRF6pLvBk+jc4upCW1LH3bVUzc2TxQMAsOi+BxYAYcx1Arm2pud 169 | 1NUphIqIvj6t2iLf3tew2XYGHvKvKF75bNdfa5uBtLg2odYxOeeukSbjEewL2MPm 170 | bN32kRM6H23QUJl88J+SY3GW2+gLlPYjUp1h0uA/8UenUDz/IfILBxdGW4OlE8c6 171 | 6AjXqAdW/hoRkaokHfvRlXl+cwARAQABiQIeBBgBAgAJBQJQwNgCAhsMAAoJEPnn 172 | EuWa9fIqUk0P+JP8+dREkLv6BX/HMwD4U3ms/NAvnXAkaKI3TRSV4LnJu7QeBWCo 173 | UHv4tdYeUsTB6T0xZ1fqI62GsqxOz7N2kttOl4tG8/Gfi/lktPVIVmBAO38eNbJ/ 174 | gUWe5XtTz+Ypq5Wt9Kqrsy6CehEcRXhFZnFWsrG8gibyWCdPrIs+ECvQRZ4URdHB 175 | NcQooXStgRahotKrjVt7Ih+lPvScLmoTRFl7Nm3UPU0+waVCLg6ZHvlNHqSpBksk 176 | VQ4xtgpSyz2Ms6t6rTBpBLXlPRJ+SYdFvFdyiIFVVYWEcEZ9iQg03Qr2v81YuJZj 177 | WnuPetQs14WDQ/K2JM3g8dGUAXISIvUlPYTEnZ8do7agOG4sIdq5IaxaubduAOij 178 | cu22XhQghq98WBfJYew80rpJg9Z/WBDX6LghGnNV3N7D0PaBq6IRCGMlfIHFCFyZ 179 | AEY1HttF86i2Oe4mCDrB+QXhc5a5aOJ3s9edk5hCjVD+BLmNP0iOR53LDWfZvfwQ 180 | X/rJ4whk3oUDXvknJEKjSnK1zbKE4tXHF0J8u98Q/GblLuUc3utaM4nLzuEnmHKf 181 | 6wswvmgw3J3b40cb/w2cXNTq+GExIH8+/IyuUAzgSXtRwzNqOCz4NRypYx9T7X8g 182 | atgPhs5Ie786smiicIYXVR3PZxR7HM02oroJmTeODMSz9UJAKnQgEpw= 183 | =t/Qn 184 | -----END PGP PUBLIC KEY BLOCK----- 185 | 186 | --------------------------------------------------------------------------------