# Maintainer: Levente Polyak # Contributor: Jan Alexander Steffens (heftig) # Contributor: Ionut Biru # Contributor: Alexander Baldeck # Contributor: Dale Blount # Contributor: Anders Bostrom # ALARM: Kevin Mihelich # - mozconfig changes for ARM # - disable rust lto for v7 highmem=1 pkgbase=thunderbird pkgname=(thunderbird) pkgver=128.4.4 pkgrel=1 pkgdesc='Standalone mail and news reader from mozilla.org' url='https://www.thunderbird.net/' arch=(x86_64) license=('MPL-2.0' 'GPL-2.0-only' 'LGPL-2.1-only') depends=( glibc gtk3 libgdk-3.so libgtk-3.so mime-types dbus libdbus-1.so dbus-glib alsa-lib nss hunspell sqlite ttf-font libvpx libvpx.so zlib bzip2 libbz2.so botan2 libwebp libwebp.so libwebpdemux.so libevent libjpeg-turbo libffi libffi.so nspr gcc-libs libx11 libxrender libxfixes libxext libxcomposite libxdamage pango libpango-1.0.so cairo gdk-pixbuf2 freetype2 libfreetype.so fontconfig libfontconfig.so glib2 libglib-2.0.so pixman libpixman-1.so gnupg json-c libcanberra ffmpeg icu libicui18n.so libicuuc.so ) makedepends=( unzip zip diffutils python nasm mesa libpulse libice libsm rust clang llvm cbindgen nodejs-lts-iron lld gawk perl findutils libotr ) options=(!emptydirs !makeflags !lto) source=(https://archive.mozilla.org/pub/thunderbird/releases/${pkgver}esr/source/thunderbird-${pkgver}esr.source.tar.xz{,.asc} vendor-prefs.js distribution.ini mozconfig.cfg metainfo.patch org.mozilla.Thunderbird.desktop thunderbird-system-icu-74.patch # https://bugzilla.mozilla.org/show_bug.cgi?id=1862601 ) validpgpkeys=( 14F26682D0916CDD81E37B6D61B7B526D98F0353 # Mozilla Software Releases 4360FE2109C49763186F8E21EBE41E90F6F12F6D # Mozilla Software Releases ) # Google API keys (see http://www.chromium.org/developers/how-tos/api-keys) # Note: These are for Arch Linux use ONLY. For your own distribution, please # get your own set of keys. Feel free to contact foutrelis@archlinux.org for # more information. _google_api_key=AIzaSyDwr302FpOSkGRpLlUpPThNTDPbXcIn_FM # Mozilla API keys (see https://location.services.mozilla.com/api) # Note: These are for Arch Linux use ONLY. For your own distribution, please # get your own set of keys. Feel free to contact heftig@archlinux.org for # more information. _mozilla_api_key=16674381-f021-49de-8622-3021c5942aff prepare() { cd $pkgname-$pkgver echo "${noextract[@]}" local src for src in "${source[@]}"; do src="${src%%::*}" src="${src##*/}" [[ $src = *.patch ]] || continue echo "Applying patch $src..." patch -Np1 < "../$src" done sed -e 's|73114a5c28472e77082ad259113ffafb418ed602c1741f26da3e10278b0bf93e|a88d6cc10ec1322b53a8f4c782b5133135ace0fdfcf03d1624b768788e17be0f|' \ -i third_party/rust/mp4parse/.cargo-checksum.json sed -e 's|880c982df0843cbdff38b9f9c3829a2d863a224e4de2260c41c3ac69e9148ad4|239b3e4d20498f69ed5f94481ed932340bd58cb485b26c35b09517f249d20d11|' \ -i third_party/rust/bindgen/.cargo-checksum.json # Make icon transparent sed -i '/^google-api-key printf "%s" "$_mozilla_api_key" >mozilla-api-key cp ../mozconfig.cfg .mozconfig sed "s|@PWD@|${PWD@Q}|g" -i .mozconfig if [[ $CARCH == "armv7h" ]]; then echo "ac_add_options --disable-elf-hack" >> .mozconfig MAKEFLAGS="-j4" # disable hard-coded LTO sed -i '/cargo_rustc_flags += -Clto/d' config/makefiles/rust.mk sed -i '/RUSTFLAGS += -Cembed-bitcode=yes/d' config/makefiles/rust.mk # increase codegen-units due to RAM constraints sed -i 's/codegen-units=1/codegen-units=16/' config/makefiles/rust.mk fi echo 'ac_add_options --enable-optimize="-g0 -O2"' >> .mozconfig echo "mk_add_options MOZ_MAKE_FLAGS=\"${MAKEFLAGS}\"" >> .mozconfig export MOZ_DEBUG_FLAGS=" " export CFLAGS+=" -g0" export CXXFLAGS+=" -g0" #export LDFLAGS+=" -Wl,--no-keep-memory -Wl,--reduce-memory-overheads" export LDFLAGS+=" -Wl,--no-keep-memory" export RUSTFLAGS="-Cdebuginfo=0" CFLAGS=${CFLAGS/-fstack-clash-protection} CXXFLAGS=${CXXFLAGS/-fstack-clash-protection} } build() { cd $pkgname-$pkgver if [[ -n "${SOURCE_DATE_EPOCH}" ]]; then export MOZ_BUILD_DATE=$(date --date "@${SOURCE_DATE_EPOCH}" "+%Y%m%d%H%M%S") fi export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=none export MOZBUILD_STATE_PATH="${srcdir}/mozbuild" # malloc_usable_size is used in various parts of the codebase CFLAGS="${CFLAGS/_FORTIFY_SOURCE=3/_FORTIFY_SOURCE=2}" CFLAGS="${CFLAGS/-fexceptions/}" CXXFLAGS="${CXXFLAGS/_FORTIFY_SOURCE=3/_FORTIFY_SOURCE=2}" CXXFLAGS="${CXXFLAGS/-fexceptions/}" ./mach configure ./mach build ./mach buildsymbols } package_thunderbird() { optdepends=( 'hunspell-en_us: Spell checking, American English' 'libotr: OTR support for active one-to-one chats' 'libnotify: Notification integration' ) cd $pkgname-$pkgver DESTDIR="$pkgdir" ./mach install install -Dm 644 ../vendor-prefs.js -t "$pkgdir/usr/lib/$pkgname/defaults/pref" install -Dm 644 ../distribution.ini -t "$pkgdir/usr/lib/$pkgname/distribution" install -Dm 644 ../org.mozilla.Thunderbird.desktop -t "$pkgdir/usr/share/applications" install -Dm 644 comm/mail/branding/thunderbird/net.thunderbird.Thunderbird.appdata.xml \ "$pkgdir/usr/share/metainfo/net.thunderbird.Thunderbird.appdata.xml" for i in 16 22 24 32 48 64 128 256; do install -Dm644 comm/mail/branding/thunderbird/default${i}.png \ "$pkgdir/usr/share/icons/hicolor/${i}x${i}/apps/org.mozilla.Thunderbird.png" done install -Dm644 comm/mail/branding/thunderbird/TB-symbolic.svg \ "$pkgdir/usr/share/icons/hicolor/symbolic/apps/thunderbird-symbolic.svg" # Use system-provided dictionaries ln -Ts /usr/share/hunspell "$pkgdir/usr/lib/$pkgname/dictionaries" ln -Ts /usr/share/hyphen "$pkgdir/usr/lib/$pkgname/hyphenation" # Install a wrapper to avoid confusion about binary path install -Dm755 /dev/stdin "$pkgdir/usr/bin/$pkgname" <=$pkgver") install -Dm644 thunderbird-i18n-$pkgver-$1.xpi \ "$pkgdir/usr/lib/thunderbird/extensions/langpack-$1@thunderbird.mozilla.org.xpi" } _languages=( 'af "Afrikaans"' 'ar "Arabic"' 'ast "Asturian"' 'be "Belarusian"' 'bg "Bulgarian"' 'br "Breton"' 'ca "Catalan"' 'cak "Kaqchikel"' 'cs "Czech"' 'cy "Welsh"' 'da "Danish"' 'de "German"' 'dsb "Lower Sorbian"' 'el "Greek"' 'en-GB "English (British)"' 'en-US "English (US)"' 'es-AR "Spanish (Argentina)"' 'es-ES "Spanish (Spain)"' 'et "Estonian"' 'eu "Basque"' 'fi "Finnish"' 'fr "French"' 'fy-NL "Frisian"' 'ga-IE "Irish"' 'gd "Gaelic (Scotland)"' 'gl "Galician"' 'he "Hebrew"' 'hr "Croatian"' 'hsb "Upper Sorbian"' 'hu "Hungarian"' 'hy-AM "Armenian"' 'id "Indonesian"' 'is "Icelandic"' 'it "Italian"' 'ja "Japanese"' 'ka "Georgian"' 'kab "Kabyle"' 'kk "Kazakh"' 'ko "Korean"' 'lt "Lithuanian"' 'ms "Malay"' 'nb-NO "Norwegian (Bokmål)"' 'nl "Dutch"' 'nn-NO "Norwegian (Nynorsk)"' 'pa-IN "Punjabi (India)"' 'pl "Polish"' 'pt-BR "Portuguese (Brazilian)"' 'pt-PT "Portuguese (Portugal)"' 'rm "Romansh"' 'ro "Romanian"' 'ru "Russian"' 'sk "Slovak"' 'sl "Slovenian"' 'sq "Albanian"' 'sr "Serbian"' 'sv-SE "Swedish"' 'th "Thai"' 'tr "Turkish"' 'uk "Ukrainian"' 'uz "Uzbek"' 'vi "Vietnamese"' 'zh-CN "Chinese (Simplified)"' 'zh-TW "Chinese (Traditional)"' ) _url=https://archive.mozilla.org/pub/thunderbird/releases/${pkgver}esr/linux-x86_64/xpi for _lang in "${_languages[@]}"; do _locale=${_lang%% *} _pkgname=thunderbird-i18n-${_locale,,} pkgname+=($_pkgname) source+=("thunderbird-i18n-$pkgver-$_locale.xpi::$_url/$_locale.xpi") eval "package_$_pkgname() { _package_i18n $_lang }" done # Don't extract languages noextract=() for _src in "${source[@]%%::*}"; do case "$_src" in *.xpi) noextract+=("$_src") ;; esac done sha512sums=('1affd4049fd014116a5a3f5693f38245a21adef498213d72c1d0d98ec9ead152448f5ec089b2a5e91d19c41a90857f8c134ae30a62a44dd68c680a1ddc6b111a' 'SKIP' '6918c0de63deeddc6f53b9ba331390556c12e0d649cf54587dfaabb98b32d6a597b63cf02809c7c58b15501720455a724d527375a8fb9d757ccca57460320734' '5cd3ac4c94ef6dcce72fba02bc18b771a2f67906ff795e0e3d71ce7db6d8a41165bd5443908470915bdbdb98dddd9cf3f837c4ba3a36413f55ec570e6efdbb9f' 'a34dd97954f415a5ffe956ca1f10718bd164950566ceba328805c2ccbb54ed9081df07f2e063479bf932c4a443bb5b7443cca2f82eea3914465ed6e4863e0c0e' '7e43b1f25827ddae615ad43fc1e11c6ba439d6c2049477dfe60e00188a70c0a76160c59a97cc01d1fd99c476f261c7cecb57628b5be48874be7cf991c22db290' 'fffeb73e2055408c5598439b0214b3cb3bb4e53dac3090b880a55f64afcbc56ba5d32d1187829a08ef06d592513d158ced1fde2f20e2f01e967b5fbd3b2fafd4' '9897cb0ababc8e1a0001c4e1f70e0b39f5cdb9c08c69e3afd42088dfd001aa1fc6996cd83df0db1fb57ee0a80686c35c8df783108408dbe9191602cddd1e3c65' '0d921a5b3e31df6fcdc71e56d0c436f9061635df5a947b65a380a650263836d29f7cce4d5b7c3bab18a4933b6f996454828744a2725d8836adbda5cf75ae1657' '841649ce1354f7334a7dcedba212cd64636c8b3c8ab1e2118ee14c3ae14decf9cc91690f40b836a2affa04f38cb584490f3a06a3420920fc89b9904996baee40' 'd1bb988fbc33f95394e1b84fa45dab3e2ea8a3768af95c46571a1b5176af0e441743ed7264343f10e9b8b4939266a7867a298ac6c83230a379abc5acfc384d64' '1a580678a17353db1f1df5b2dc5f5dd84e41a5eebe41af32196ff1a06dbf16c73f9429398fd8d52023338d86ae8a9622e9b400ed55e1de6c674680e5fb00990e' 'cf1809bda13805ddca66083183de63d1c35f2c66d7576f75fe7926399ed9e067b04eaede707be674b9ecc7a35476266accd4c5ea2f18563dd9ec281db33f9482' 'e764bbe29571d276be1b700d74ed4180de2ac02e87f6f025f6153aceffdb69497f7fca16c689a5ed71667f74c12ede948b8933acb1a71d1b78766cefcca067b3' '4884021301e7eead3d65992282de1a5614e62ca34178d4801ae369a367c80fcf0799ca0532644d70e405059788ba96c07c3c4442f9be843765322727d12914c0' '476b8ac27f5f3568d49014c23caad54bcd29dda8ae4b8f79be328616c993ac9942a7de4ebf97dda13fe2cb33dd08bbe249872c50a788cd765e48936e6ee2366d' '7eaab3dbb9c2e80859c9e7c4ba727117268a62fa2a49e31279718538c6d5e4d2886673c47951718b026012cd5428477e763e4313602d55991a21d87aa11cc82d' '2f99bec0e89543250d08bb2d5c008dad5c64ce2d0ab4e569179251182f4683ad21ca6e4d79a74ad93a73c8986bfec1585f5dfef42ef8951ca6beb6b5f2756fbf' 'e598d4460aedcf5c853c6c728e00cb710fff791bd918900a383a45dceb08918368da76341d78194719112269eb20ba346513b3edbeacbfc4ae66e0a4cdaf28ee' '9a28e6f55d1c98956d55ab3d54f66b51e714b5619cfebdb66849f6c80683ada06c3fbb79b5fa1eb8a40d67d0c205db82858457c64d7898c503d51f22def06715' '37abd46027d6e355aae158f0f05deb8ebf8c30f8a29b29b49798f0c957c700d49af7bc8641431694d5cce232298ca81a9fd6abe5b70fad556faa69b0f736682b' 'ccc3f0941cab1f5012b17e255484285adc3daea6cf717d37b4c0dd8fc2ac3ddeca2043a5c57b54034a1b3899f2717d9ec038c427f56d69207331c8671df426a3' '837c18d26cd113ddb576cc04119b2389507a7f85735b2f544b313319d4dc6029f92e64e8c3c71ababf02dc30e597c35453be37600cd2dc89cfceeec986690e2c' '4e1d7e2a4b0ebe1f9e1a7059389626fc3917b5ba277ec959561be4a05c572dd9f2aa9c1f735c9183da16f5252dba21c6908ade89bee5496a43aa0d3543bd3e44' 'ca617ae57b0528907cdcaaab370653ff8846b8087cd276d8fa5b5122560e8de9ee7764b19bd0b63a82227bb618394d2ce6c895b59419e9c089f8f607a0e74f91' 'a54b3784b8d3d85d8db5c4c5f0a5d30a186cfe614b2101bb181daaf4fff067b24d0b76c1b3529741f69a16e84e187062deb4d04841edb237fdc08be1b1ad38f4' '5af67957a924756a064244d745e24ff7efb33cf8edd1a6059b00a85d9e861519be268eac7162caf5ea9acb92e5705c3bbd87629a01cd5def20d7ad7e05e14fad' '4ef6e401f4ffd29decd05a3bc10e4515a0d65a81ae0831f154fd60361e45a1949df2952f71796527ed4cc6a479b3a4d606091ecb79ab893498c1d9efdeadbb4d' '17192431de7cf5495963d83eb2b1bd370a3a8f0a8e0b912462a8a56867cbcd84a41f9b2b8bbf7bfc635de66f480e32e1f67bf23f491506b56869405702250b79' 'e91229a65f7f6d8d49c4360c94a6a416aac80cf61b821a3f1973a476a7b3b44140e3322350aaca0eeba381200165eff91b35b3658b7166b6c18ad5ceb7b6d310' '059504b3f1d2f084fe04462ddf7cbe909f0e2982844fb14d78ddcc34c340af41a17eddf0983fa0f5fdea138bc7903b80f5b618d01a144e8d49ad7c8b82ffa9e9' '423c8964e2dc68ff6eb9224a9ac1f4a93c110df9cabc28d82a73708bca2462654b7552799d376a0ae8c66b2e9a2994913fd18af317f6eb4cc858a8b385d21e68' 'ff1d218f35c437905adb6844cd6a7a45eacf0bc7d89cf2ee55fe78c7e39d04dbee8d23da48af1bc0f2136f8672ceed5beaaca1003695cefee87d0b3192ec44d4' '84839f342c3d1eab23aea2ade1172f1a8dc36de07c9f88273dcc6fc7ae1fda3e31514ff0d7bc7b5ca1d677b4562a275c4c9ae34f8c2eceae299d2d99ef04c788' 'bd648910a7ba14b2831942e8b459b29af5af1859d168843e3be47fd0f541775871327b5b5a94be7a5214a27f0995e7b7ee0037fc46f1993129be2874157e1a04' '8e388e6fd548eef5b2b10a0ccbac34e3940002fceb5be595c7e710b4a9e352bb0afad75ed200e40f84ec8001242de5a22531ef80fea5f431e13be80f1e7f4a96' '2b24f598a2fd1fc9360cb4bc51a7cd6412d2a85b09c5ec40606d2c2f4192ea7c0552ddbe4ecfb4514894c6d3c6e5713a1f0ede7e49d60a71bd58587ed0fb3eee' '5ab2fbddc39f9712c3691a159ffec7b6364525dd2a710e1860a7baa53ce5688c0d0f402eb7d45b472feeb2bf9b2ec1fd04675c66d623e4b274ecc5855293920b' '7e0e02f79dbe6d54f68760ac0c6832f00ced4021e77e15a14656b9df43488ec0d8b65d1b2702885fef0a4cebdc1c470fa5d67ac07819165dc11476aeaeac8d6d' 'f7934cf045a94f46e31f58a5c91c087fc411cf72357643ada7e2751a54cf73e3d00bf728264d67edd7603c933f44ccb4d084e6852082f2bce6616e24c4cf6d40' '26363744fabe2a23cf8f701ad192a5f39ce34c252f20676035b96cc8ec81c504804b9c9c991d92d0b62730171d4dbd0ecd3a9f7d5e8469888778e1d498df7c7f' '09fd2653c9fae89ce5270f92ab0b4d86fb89d0983891867396d9a10e2d0b3ae1393766306148bbe2ab3008a9a29bfb5f11e984c2feae14e7379501aff463acee' 'ab2cf3b8dac98690305c8cea57a69cc06984ffb52d4ef25939a8943e640a1b0b5382453eab376597c1decede7a438aa80156a67c36cb7e816d5941c3a67b451e' '6434dbf300d4db892a9f78ead0845fea4184250a68f45ead47fdc1f300cd473b5d60a4d1d6f73d04df9ee2a7048461ecb054395c28ee1d9536e34092ebfc84f6' '0b3c34f653cf5c2a19814549fefa04c572216e65db05bf400a0a52e5a5021c5473ebd30e4a34093d4e693807a9072e93c87a21cbc5add962f371c78f6b817914' 'b21305f7435d72f47baae49cba7a423e6e3d6692325c953c096fa583e675e4d48c097bd0ea7e4442d83f079de56ccd1fe0790dd01a7cd2f432d1c3b6329d025e' '88a1bad45000d8998054582d06003efe7bf8faec7bd5fa9ade8f8f35956a6dff94c87e212aeed732998aef78f30395c4a1c46d5649aa2bf45b5471fdaac94b7b' '218e4c8dcb14db210ff688c549eefdd859bbd0a955386fe3ae1cf7d42f93aa659af471b7bae3df6baa2ab4a5449de0d52451aba57a27f44c73428cf477c71944' '97866fbda474893c023116f9bafe3429bae8cdb7f2f5b7b3d03a17556876b1442ebcf04f026a038ee8b87beb0da7d6445f9c724bbcd31db55b19d789a55d53a4' '07913b4541f8fbaa0e1d43b17f72fcd43b367cee9a1781d22c3642eb2d1ce76f4666e657fe61cc133d79f7289cdc27315c9390ad13a16af9ba8c312cdf389521' 'b81b56dee44284503c41635f458dad46391f1ab27faa91769fdf64d42ce4a8174b05abbb33b2ec794a366c7b7967fb25ab1439a4661c3f86f789773b0a378323' 'fdb2742bf498d3196d4ce30b44b3fc7a282ae1fd12e59de8b6bf4eaa2e31a346918d27e7218278ff5269385e3ca0f0949acac7e5b11ce3223d280f361d278ec3' '7006cb3929b96856ccfba11bc1dc3931188c53f7f108b8a341a6feaf7138bd0e6e32102f6a597c30a89033c32d567bb176c850db020731534cf0934a4263de6d' 'e19a5a41801081ee2f5f000af0a01b6a2a25bee97881fae4fc5f78a33294c06fe87fee4af7599d5c5eea54c9a27e78c00b63f6dad9b23857a64981161aececb6' 'be25a575b60752018845ebe7483d99c9f1ab5ec5b3f50e67d6626182260cd13bafadc59e9120dd080d4bbeb69455f09cf3454789e6ad1248f89e031b34538679' 'a9c6a39eb60098caa8155b6b387063656161f2838ada540375624aa78bdd82008d57900f3100033742e282264e73cc81a7a00a72a4c6eb97d0046a1e26613913' '6badc345ab73e4db3c64d5492ce7cf7f8226c6c80b6160f555fa42f00900cb166429da5caa8a828a1a3cea8b7516ba330825a20cafb454a6cf985565957f1602' '026fd78dfb4548060b76d589d58a29db18f7751c1dcc2fc7ce19cdd743d492edf8f810e2edf610afbabfefac26b1941356c28c807f2792929c46cd93f6b46338' '9ef501c67f9c5686096ee0f946e5b778928bd2edf027965493cbb3deaa4abe508c93f7ca6450b3ad52bed52ab74f7106fb260b0e73f0824cf3a44e10b0da0910' '411619eced8cbb5a0e7712d1a6ef20bba777491e3c3c8c3d139a9ed21eeac3529445bdacce3e57631dd3d047b6f9d36cd16beb07f83443a688fe4b2ea662f03f' 'eb6297918da31118003aee23da2cfca35913e63c4ff10a6763cfcdedf0d3e91ca6bf5aa2bef21c4f2a454236516b82ce9f682815754e38816ab9c0c75b1b860a' '3d98e394b4e0ea975d6a2ef9108ac8a81752e28fb5dc6f221b54873fcbabaa2cb8d32552f3ee8b6bafa60c59dc18cde28926c5d1a25412d43671da638e2dbda3' 'b6fa3f1831fedb4e98c496b35991f25cdb8e06c04085c7e8eb2c0d0a6c986bcab6764712527ad31e8fa234356fce8700fc63fdcc0023f71fcadd2b914149bb5b' 'a21f01ba0627129bab06c62d80188a0e5caf07bef30491a2a91b2019e50c3cc85c58b0d55688267173854338c0224d78e5e41078d42bf536fb4f7c3313762df7' 'a2ed2042867f31deb437e5c0216e3bc7b793b69ccd2f57642d3d42d5c73b7c062448912d3b486d25be37d8f1b7a3d5f4d0550e492cfa5b31ad630b0221382cd7' 'fb96c118e444b0d8588d8155f348ceab941a4940b9b8ca80c4d82ed6149bf027fb9703ce8a0d70f54e9aeddd097248876b0cb814f00767a91b6b308df518d69e' '35704c3e0e7697f8bb50e3e8dba94d4124fc663d13d8eed86de4b04b01f1361a6b98065a748b2e7091bcd3f2dc201bf804b0ced471423ec7bbdc2e8f7588b42d' 'b53733ca5361b45d3ae82982634941decdc7f7dc2615708bd758d1cc9fb0254255c4ed3f375df0ecb70cf0cffce0a2c1e8b25cea0530666ae6556a617be95c9c' 'f3de9253eb9c5761cf18e2d1c4247d971e3ab577a1eaeb83b9ec059910970adbcfcfcfb66c61866fb83f4eb978506d638a9601b3acb2e3c4b7cc32be21866cb3' 'ccdfc3016201d3bd89f6970e22003ff9253ceda879be068d42bf43322148fabc125ffa1c9368715f0405c9c06a7259fc81029b21551547e6d5e804babcb86a0c' '310a77fd1ef840fbd995821cb615194bc0776505d5aa53f9a691481a85ef32d6cc4498aab4c1a9b70f0229376a64699bc2f6dec873985156465d64298b0248ea') # vim:set sw=2 et: