From c9c831f9ecfec4d705e843b3359047d6365362a8 Mon Sep 17 00:00:00 2001 From: Johannes Date: Tue, 20 Oct 2020 21:55:19 +0200 Subject: [PATCH 1/2] firefox: update to 82.0. --- .../firefox/patches/fix-fortify-inline.patch | 11 -- srcpkgs/firefox/patches/fix-threadname.patch | 13 --- .../firefox/patches/musl-rust.configure.patch | 26 ----- srcpkgs/firefox/patches/rust-configure.patch | 102 +++++++++++++----- srcpkgs/firefox/template | 4 +- 5 files changed, 80 insertions(+), 76 deletions(-) delete mode 100644 srcpkgs/firefox/patches/fix-fortify-inline.patch delete mode 100644 srcpkgs/firefox/patches/fix-threadname.patch delete mode 100644 srcpkgs/firefox/patches/musl-rust.configure.patch diff --git a/srcpkgs/firefox/patches/fix-fortify-inline.patch b/srcpkgs/firefox/patches/fix-fortify-inline.patch deleted file mode 100644 index c1190197d32..00000000000 --- a/srcpkgs/firefox/patches/fix-fortify-inline.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- media/webrtc/signaling/src/sdp/sipcc/sdp_os_defs.h -+++ media/webrtc/signaling/src/sdp/sipcc/sdp_os_defs.h -@@ -27,8 +27,5 @@ - typedef int16_t int16; - typedef unsigned short ushort; - typedef unsigned long ulong; --#ifndef __GNUC_STDC_INLINE__ --#define inline --#endif - - #endif /* _SDP_OS_DEFS_H_ */ diff --git a/srcpkgs/firefox/patches/fix-threadname.patch b/srcpkgs/firefox/patches/fix-threadname.patch deleted file mode 100644 index 2256d5fae0c..00000000000 --- a/srcpkgs/firefox/patches/fix-threadname.patch +++ /dev/null @@ -1,13 +0,0 @@ -this reverts https://hg.mozilla.org/mozilla-central/rev/9f8a59996994 - ---- toolkit/xre/nsAppRunner.cpp 2020-07-21 00:49:52.000000000 +0200 -+++ toolkit/xre/nsAppRunner.cpp 2020-08-17 21:12:47.688908716 +0200 -@@ -4741,8 +4741,6 @@ - CodeCoverageHandler::Init(); - #endif - -- NS_SetCurrentThreadName("MainThread"); -- - AUTO_BASE_PROFILER_LABEL("XREMain::XRE_main (around Gecko Profiler)", OTHER); - AUTO_PROFILER_INIT; - AUTO_PROFILER_LABEL("XREMain::XRE_main", OTHER); diff --git a/srcpkgs/firefox/patches/musl-rust.configure.patch b/srcpkgs/firefox/patches/musl-rust.configure.patch deleted file mode 100644 index d8f387136e0..00000000000 --- a/srcpkgs/firefox/patches/musl-rust.configure.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- build/moz.configure/rust.configure 2019-10-28 12:05:04.930404603 +0700 -+++ build/moz.configure/rust.configure 2019-10-28 12:09:42.742338957 +0700 -@@ -297,11 +297,20 @@ - suffix = 'hf' - else: - suffix = '' -+ -+ narrowed = [] - for p in prefixes: - for c in candidates: -- if c.rust_target.startswith('{}-'.format(p)) and \ -- c.rust_target.endswith(suffix): -- return c.rust_target -+ if c.rust_target.startswith('{}-'.format(p)): -+ narrowed.append(c.rust_target) -+ -+ for target in narrowed: -+ if target.endswith(host_or_target.raw_os): -+ return target -+ -+ for target in narrowed: -+ if target.endswith(suffix): -+ return target - - # See if we can narrow down on the exact alias - narrowed = [c for c in candidates if c.target.alias == host_or_target.alias] diff --git a/srcpkgs/firefox/patches/rust-configure.patch b/srcpkgs/firefox/patches/rust-configure.patch index 887c102bc55..84c385dbc9c 100644 --- a/srcpkgs/firefox/patches/rust-configure.patch +++ b/srcpkgs/firefox/patches/rust-configure.patch @@ -1,9 +1,14 @@ Mozilla rustc check does not support crossbuild: let's remove it Remove calls to unwrap_rustup, they fail if rustup isn't present +Do not try to figure out the rust target as it is broken on musl +instead use what is set in RUST_TARGET + +Skip extra checks on cross builds (broken for arm*) + --- build/moz.configure/rust.configure.orig 2019-10-17 04:19:59.000000000 +0700 +++ build/moz.configure/rust.configure 2019-10-22 11:48:55.616022140 +0700 -@@ -78,9 +78,6 @@ +@@ -81,9 +81,6 @@ return unwrap @@ -13,30 +18,79 @@ Remove calls to unwrap_rustup, they fail if rustup isn't present set_config('CARGO', cargo) set_config('RUSTC', rustc) -@@ -348,26 +345,6 @@ +@@ -225,7 +222,9 @@ + data.setdefault(key, []).append(namespace(rust_target=t, target=info)) + return data + +- ++@imports('os') ++@imports(_from='mozbuild.util', _import='ensure_unicode') ++@imports(_from='mozbuild.util', _import='system_encoding') + def detect_rustc_target(host_or_target, compiler_info, arm_target, rust_supported_targets): + # Rust's --target options are similar to, but not exactly the same + # as, the autoconf-derived targets we use. An example would be that +@@ -340,13 +339,13 @@ + + return None + +- rustc_target = find_candidate(candidates) ++ rustc_target = os.environ['RUST_TARGET'] - os.write(in_fd, source) - os.close(in_fd) + if rustc_target is None: + die("Don't know how to translate {} for rustc".format( + host_or_target.alias)) + +- return rustc_target ++ return ensure_unicode(rustc_target, system_encoding) + + + @imports('os') +@@ -369,26 +368,6 @@ + + os.write(in_fd, ensure_binary(source)) + os.close(in_fd) +- +- cmd = [ +- rustc, +- '--crate-type', 'staticlib', +- target_arg, +- '-o', out_path, +- in_path, +- ] - -- cmd = [ -- rustc, -- '--crate-type', 'staticlib', -- target_arg, -- '-o', out_path, -- in_path, -- ] +- def failed(): +- die(dedent('''\ +- Cannot compile for {} with {} +- The target may be unsupported, or you may not have +- a rust std library for that target installed. Try: - -- def failed(): -- die(dedent('''\ -- Cannot compile for {} with {} -- The target may be unsupported, or you may not have -- a rust std library for that target installed. Try: +- rustup target add {} +- '''.format(host_or_target.alias, rustc, rustc_target))) +- check_cmd_output(*cmd, onerror=failed) +- if not os.path.exists(out_path) or os.path.getsize(out_path) == 0: +- failed() + finally: + os.remove(in_path) + os.remove(out_path) +@@ -403,20 +382,7 @@ + rustc_target = detect_rustc_target(host, compiler_info, arm_target, + rust_supported_targets) + if rustc_target != rustc_host: +- if host.alias == rustc_target: +- configure_host = host.alias +- else: +- configure_host = '{}/{}'.format(host.alias, rustc_target) +- die(dedent('''\ +- The rust compiler host ({rustc}) is not suitable for the configure host ({configure}). - -- rustup target add {} -- '''.format(host_or_target.alias, rustc, rustc_target))) -- check_cmd_output(*cmd, onerror=failed) -- if not os.path.exists(out_path) or os.path.getsize(out_path) == 0: -- failed() - finally: - os.remove(in_path) - os.remove(out_path) +- You can solve this by: +- * Set your configure host to match the rust compiler host by editing your +- mozconfig and adding "ac_add_options --host={rustc}". +- * Or, install the rust toolchain for {configure}, if supported, by running +- "rustup default stable-{rustc_target}" +- '''.format(rustc=rustc_host, configure=configure_host, rustc_target=rustc_target))) +- assert_rust_compile(host, rustc_target, rustc) ++ return rustc_host + return rustc_target + + @depends(rustc, target, c_compiler, rust_supported_targets, arm_target, when=rust_compiler) diff --git a/srcpkgs/firefox/template b/srcpkgs/firefox/template index 218dc97bc21..3ab823b7855 100644 --- a/srcpkgs/firefox/template +++ b/srcpkgs/firefox/template @@ -3,7 +3,7 @@ # THIS PKG MUST BE SYNCHRONIZED WITH "srcpkgs/firefox-i18n". # pkgname=firefox -version=81.0.2 +version=82.0 revision=1 build_helper="rust" short_desc="Mozilla Firefox web browser" @@ -11,7 +11,7 @@ maintainer="Johannes " license="MPL-2.0, GPL-2.0-or-later, LGPL-2.1-or-later" homepage="https://www.mozilla.org/firefox/" distfiles="${MOZILLA_SITE}/${pkgname}/releases/${version}/source/${pkgname}-${version}.source.tar.xz" -checksum=91b6482de9b193b19d1fd9a8b99015a001646a48429297bbb7fe41784f9f9b44 +checksum=90c58707f5bd34978e2d1bcadbe463556edc0878430f969893ae2f89c5d464c2 lib32disabled=yes From 0eae75e9586a454771f9a0512f477bd0ba16adc1 Mon Sep 17 00:00:00 2001 From: Johannes Date: Tue, 20 Oct 2020 21:58:06 +0200 Subject: [PATCH 2/2] firefox-i18n: update to 82.0. [ci skip] --- srcpkgs/firefox-i18n/template | 194 +++++++++++++++++----------------- 1 file changed, 97 insertions(+), 97 deletions(-) diff --git a/srcpkgs/firefox-i18n/template b/srcpkgs/firefox-i18n/template index 7091d485590..d5772d19f8c 100644 --- a/srcpkgs/firefox-i18n/template +++ b/srcpkgs/firefox-i18n/template @@ -1,6 +1,6 @@ # Template file for 'firefox-i18n' pkgname=firefox-i18n -version=81.0.2 +version=82.0 revision=1 build_style=meta short_desc="Firefox language packs" @@ -140,99 +140,99 @@ _pkgtmpl() { } } -checksum="604aa5451e258e79cd757543a99e1354cb6be6c53419d7e1e89ea48e13482393 - 1051a08c9d5709e40f1f4a7b4701c1437aa4e39bbfbfa0972aa6b8fb17c53c03 - 0bd430da77d9d323dae35ba9832f0cf626cf292536c0e7590dd4ed2c9b6ae253 - 2ff2eeb3dc888b5cba7779849050fe684038c7dd9793dd80d475bc1713b6dffd - 9fe4c1a1b3de982adccdf236e643e242db2cef468a06e323ca4de76f13280ff2 - 03320db030a298d8dfa22032c991f87b6704fa297caf38c627532346057453ec - feb2f8d65fd434a16a78f485423172b48839f9d1330e3d41111e933b54cbe8af - 0ec565e217543ae9299473718892cfd3dd4ed81832e80ba8ccb876db27a2c2fe - ce24295751e749dc01468a01f2dbe1b3e6dc1bea3e54d6cdff86bf5a551d0606 - d134bdd3ae99890f927e795a06e4d54970d6d15d3b1bee81fa239834f2631c8b - c1f7ebdce0e73977b0bf36e89e0bbbc057bacf018e84595a5c608c08b7c5af6b - 11d3cdadab2f3fa4659e88e3b963a9e3aa2a8705b15b43aec2de0a1c389fd7fc - 922de30c33b67c787d519b7f9c92fbc2fb23156b1ba9b6ccdef9be9527c6a523 - c03061ddf48dc4c89dd17917dd16a11b049a21058578c1275553923484542484 - cd11e2b4bbf67ca7342641380eab80b4701e0fd8415b137db2c7554ae2975592 - 98437050791292507e46809183eb3f3c1e95c2fbf38d664b6bd5126d677096bc - 946493acbef2ecfcb18da46f3385b3e6ef87aa352c248e4a8991edcf7d6f46dc - c68bacfb0755360a8ed84474bcaa9fd91449558d9b790167ea589970369c3bc1 - e8d8c1ae148c4cfa285e62968f3c608611c15819cc93fdfddffa5be29c20520e - 327d3605092f4bd00c0d2f69472e98ae5a1da9dbcbd85b31ead7de08b6c6f2b2 - 70969db6ff80f6efccfaa3b5c57988268d92bdcd55a9ce140a8562c4b6c9351a - 97c05cbda075f1d618d60076706fc06342c13923f9f877ef2b3f5f89822801ed - 3adeea323e81c7580bb45c291d39b94b345362402b9322eb1fdf07e217b4787e - 262845b9a68d5a02e012973bc760a523524f43feb463451d9995228e9dc70393 - 3fb54cbf688f1e92971d30d9552c776a4fe11152de5a2a28f4a13bdcda0e04cd - bd265cb44f58cc9674038d064ab97ab4f58ca5bec558721780489c439896b02a - 4ac8915bb7ea75f0ff0dc79c30f8f97da1e5e24e1b42bb7dcba615de67951704 - 136fc5a5629e30acd3bceb2992d19316319274c8d469719476b70d930c5a00ab - 36b062a37d603d23dd206fadaf0c3d69c25c73f058c2d9bfdbaee2e3cdf453ad - 47bf30bc53288d9b06aee041c4333082ebc47f7717df50efefa343166fa4be1b - bd4af27f62fd7530bcf2fc2d643e95da1faff941ccd791854f9d5ea0ab399199 - 6b3029586f01df71c4ac24534dc8c7f0e7ff1363084ecf8411f42d03ad8b369c - 33003de372e123af11e9a638151a2b209236b968fbc937fde6048c98c27454d4 - 0663318af5b9f53831febcb0ec29d0e6c06bd8cc10f987199a74426ebd7d5999 - 4db5d6d77c40b29010ca17627d0b0a7a9d3516e5e5e5cbe1f50058c0ef2f1662 - 22a30fafb4682f72d776cdcc3e66405ad7ff80f56ee6b00e580523ba678523c8 - 532de501ebbf9c361ddb0d09a1c0f7c82921a5a3f2f3c241f1c0512dcab6962c - 96b7685d5bb55acfde4e327c97aca4bf428e8f22d1daaba685471a6678b0a3e0 - 2a2c01b8ae6561daf38f85e30324fd4c91e9a374c3922e4b30cf33a16dc145d8 - b06d4dd1d284e58a87370d95c3bf37c44a3ffec35e3c5170370c3648a25b305b - ee6355a647479daac3238076ccbdf00cd64ad602fbfccce0b04f53fb3fb1084a - d33fd5396da6fb088e6bc7f0be618c2bd3cecafdda89472a2449efce51913cfb - f1d0cc716336dbf97741da8aa56f80cafd01f2a2214eb5037c76d4c157810a35 - bbcc2adf9e57cf279472c173766627b0f7e6ef08425d7f64cd5777db4f40bdbd - d0913e3343835e4f6bfaf7c6353b9b1cde380d7915633384e5d86c912da7ae45 - a823ad58b57ac828b5e21d80b58a0484b4f12c99b7b36d5eaed47ccff8d1159e - db89f43db9c82b98a83eff4554f998fc7d5561a8148bcafebb023f9e14ef1aab - 7c431f0e47bb3950fc872ac126018b14f7b20ff8dfbfa309d45f105e280637b0 - b00f4dfc43b14d834681df38415c7dbf13f244ffece38460bf176b7bd75933b2 - fe1f9a0018ae1542e993b7962a21a146fafaa941b5eb2df3e346365967e307a1 - 45ecf45822daf34ca903917b089ddbdd1da49bd987a5d37c551b6fb38b8b1ebe - 61fc984be51defc98be9a02a1f89fe8f7286e3e77648a8cc8a5abedb5925c381 - cebb89c6196b5233607b89c07e7e88bcdace37d5c7a2f821ed906c44c9a9b0f0 - 66579a867f1d2da22ff329b63f017d456c885bee15e2e5d3546bc5bde436d0de - deadd03702e7c08fca31a9d5f5bc5210876fffb95a6f4cac08d00cb938280439 - 1a3e45dbf4583a7d8c06eebeb92c89e735b16fd9a2c34724f83934b8ef3b027a - 5a7bd40ef246636905b1f31952c84f7aa4579900e23af3ea2b1d34406598fff0 - a1c2e0b4640453fb94395ada3af91e86c6d120c7e48914482694d6feb8c395b2 - bbd50ae8d4c8c83df4f74a380d7d649da404bad3f7ed6ab969084d0451c93f1d - 5c1da64216076a462838b12bddb4da219d30811b0701189a0e172bd77830b29f - c8cb2caac53f3686cd9ef92efa31efd928902a2eccc692b85fb85f8ba03d231d - b7d27c7520e0c7a343ff9c714cdb21c9f336d0192a78acba40fc7ae8f6be7e0f - a6f079645bb17d2b237cb835c6f547ef21e1a8cf1abcacb30ea906a81b9dfe3c - 1d3dc376e47be71de62f7cd5f705b40d2a888c4e53b4f8d8b1f46a48767c3ca8 - 1214da045fc77d93d309379f792b29fdae6529ffa61cf2a119293db05b40e24a - b883c4b009a924f45fb9cdf7c25104d59fc75e09387f8eaa5facc8bbc870333c - 44d1e6451f7f61b9250933bd5bc8c999234af933d28c3fd97c0805e52308dbcf - 49a08cf10d1ba7d5485946f92442e12ce518cf1774a5066ef9bf8891fa297dc8 - 85bff6db7c89620bc453adcba0779a37b792c525b375868a5516fede5e40e712 - d9907cd1f6f63c628b0595d51f2f7d82aaa9ae87ac17a871e3d9bedd0956b910 - 22fdc1e1f22a5ec149b7b131d590f1f2bee8406064fdc07d482e8809eb7bfb1b - b8f7ced54f430c18a11f1c0d344759cad4e6b936bb7a75928776f04c845a7569 - fe91b696ca1ad9ae7d67f49624845a24c05199cc514b650076527697c3f79404 - 8fcb74a335757d3a71a1ce4f5ac56ec2d28accc6ff55912dcb39e2bd1d59ebc9 - c452f6e2bc80710a9294297cb2f10e007e3b5ff7e23bde1d9f395b8f3401f163 - 0a002cadec157124f7e5281769da42e67d108b606e64cb3dfd24682d5633cb1f - 247f57b419d6dcf2cdb463b871bc9798427b5a695118cd039245eae8aa25bf8a - 9d10971faa0afbb1aa5d8702e04a6abcf777c4516102451c6f96ebfbd36d2d3d - 296af22d2aa7da72a9e413dbfe99f267dc11f7d307b051d7165b0773362479b2 - e5663b9db0b7081e3df775e8e299c79c6b6bf46801d7bc8ea2db97e06c1751ae - cade8ec32b8e3c14a462bee3d1074688537e9835762fa2d1e49c29a5b0602edc - b06a1487b4881ba91c923112994da35b68db8a77a63dcd51669f1d5d1f6f9b52 - 64de1f2fe797ca72fda1058fb3b33267910cf7890b4eefcd1e2c026b4bcdc211 - 58eba7c1b53bb988c72d7bb2c006c104957ba897ecf4658a387ae8e6a74ff462 - e07ff12e0d7caba0f2918ec9ceab671b924b7c1793872871a8c7c4cafe48c2da - 606f254c1b2344c776a3335a747614cc4c56548b019502b816dfcaafbdcc3a3d - 87687e8a5db25e3c19fe9557cc8d5d832b2472507846d87e71cca27c63e9d268 - 9a340d62872f281d63cc0bc9523cda21afa50e24e162ef4603a1f5d5ae72f099 - 7f567daa00eeca8f60136d35a2d9bf7115df61f4053c6a687e485303a290dbd1 - 1f36aae53643600b0cb911ded167ab2bf3623d334a79e0a4cf5a967a684f6fb8 - fc6f8d874ad0a4a307109e3d54a763aba158195f12e2e8291c73a4c4f1985641 - 5a3f512df7b59b9df8fe8bc58fdf1cf528c81afc4d284585df7dabc8053106ac - 85bd9813ff26b800b2a316f58e3f7d23c215e564a3235d959db28f7e6f3bbc72 - d9e66b9a6226a8056a47f9c475f03486311be4d47793826a2a434f06e6d1a062 - f6f2d3f8573af9281084967c65178c9bbc2fff28b2b3c103f48960425585810d - 891ba81c96b32cb099478c0f34ce2f10c1ddc7775ba4164be61bbedd2760d480" +checksum="d89f96f9d2e6229c15242be4d0bf66e86c67da7954063143dc3e3edcd09a7cf4 + 70aaf0ec88c2c8742e7ebf1aebfb17326d575ed084672640d97118f90c2cc84d + b0417108e876a3422a2cef819651e02cbe789b0d0384d40760f71e2af55aa59a + 332056025d7c9f8a3b2af7b70e74ede7869f053cdd7a3200c96cf3c6b092d4ea + d3ef51f39c3175a26c2c1c01dc5edef291e9abe5f93c0d4bc49c356255e56a87 + a37e893c62398dfbee38408cea735298c407394e7e8a3176a0c4f1f2f44b652a + 8d9486f8451a46e1aabe9b4625ee91b398abe874e71b2a7ef5ec31b055fbf93b + 4b3fc348b9d2f8f0be26f84367c7866d34271790aaf1f2ff16bd059ed90ec822 + dccc6d89c626e56fcc7ec401b2a4dcdb884e138054317eb41bdc7630e08cd965 + fa87db9830998b71eb8e49dcf0679ec35fa19f4ab86dfd3cf0f3f5b915106817 + bdeab144d94983f22f51cb1761d0794115b7f4280da9c8c3d02da6add309075b + 2a2a6ee4def85dd6928db70198951426faec88f3e2ca753217d7b03e46cd5714 + f29eae9dc381b0a2085013a1cd73662f92524dcfa2f87743eb8ffd733b1a4b92 + 0c1ab3c5e92b540366ecbda64197c0d036ccecb16e4d111518ad32f082c6757c + 970438f2ca82a12112541da78ed27b359e997244d19b01d5ca8176806ed758b7 + 2963689ce5427dc1523c7ba48d8399edd27d1b0b704c543c78aa445f507949b3 + cafa70fc871329e5906c099c025d445840443655e222f8f4e88771a4992da3dd + 87e408e885b5e4498bd0a1278b5506b44325bd9ffe5aeff15f02516d000d2b92 + 69695ff38584314407956cf2d7cd0184292c5af52fffa60f169dd24e6be1a019 + c960baf2c0f55dfaea1008e811b870116fc127a11ee82b05c10ee742db152ca7 + 377bf984dbe4d2cee3c75f6dc2b10bcc435dce33631e943fcc252dd78386428f + 220027b298644287fc7821f320b82576cd1441c722b4682f0060dc4660590cd6 + ca65525b26ec910e4db60614cc68208c7d8f4787900c2b9040a8158c7590a83d + ac76dc0b71c5b45bb11fc4103240588b13fa82e367518e96e2553a02088cef07 + 2a9ac7c423bcc7de5afdaf516bf1f337d57bafbd99080215489d2ec09f894359 + 29b323bc895cc9bcdf9e14f04fe360a68ec5d27640da0508542cb567d052e472 + 9a13bcb1cd2e052f768ea7312582fd39371624c80dc4b2eb7c26553afc16e0e9 + 2e890ce1a71b04deef1ba9768d2c799b721b300162670f1ef89c3545c679f7d8 + 416356e3cc144fb337e1a279367917c1320edda60c714f06e3896472397b3fc8 + 0282c70fbae4220b6f587d411aa31721ad4c2f34329888c2411423e8ce51ffe0 + ef1f709922d0060b52556b0c3bf95c413f75d9b1ab135cb963ee97360e927d4a + 1b6927f6752d469140f1404ce2e48767fa8115ec590f4226de3380c54951b98b + 2bc51f68a34e1410c994bd22474c20cea7dd898c155609bbe76d8810cbd66712 + f1b08d186b60bec05805be83e5afc9fa67dfbc146b91fe27ff8871b55122a534 + fc80afda30eaeaa60dd51f0df96201319c18c979910e374d419627a16fb6b8fd + b33f037eac770f16689c8919001536bec09e770dbce6ff7bcb93d132f589ab23 + 48994d5fd667f5e9d9d6383238872d8414cdb613f73167913b1e9f563381eb4e + 25ac103b787474fe077a7e8db5b8d49f59a500ce267e9889a915af9d5a2a6d1d + 689cb55315171ef58a0ec833e665983536aca61e40ae1441473ebeb7acb6cca0 + 111229229191d7946e45ebf79e081bb51443361346ac01def2173b3efea28538 + 5ba06b94a972904550e25406e84411871570f209fe954bf21a55278418654bab + 5ec05f275d9809907ba3361fc92fd3e5adaae50d8cb556014d9f7f57e3c157c9 + 3af6ea5e4753d81c1785cee4fbd9844a0653a58be83aba324e4c2b0aed6b3d9a + c116e46f48c4c558503a6d40c0a32ff8a31de87eafad414cafef6bf5351aaaf7 + 1eafe77b25577cb87424c9de833c4b4f12e477a4787e37d4e817639ef13b5c26 + 02e83c33d6dc733dded6a25ca68c5a0c87d13aa40d032644cf54be5640d3a1f6 + 9219b9fda1f46457009ff4cc25f4c9b7d29a175607e81aa7aee97dc02e719e0b + 2577b67e39b497b6cac0e0d04a49b6b61d03b5fb6ad5f3ac4418d3300a25acd8 + a8410000567c0d0ca76aa73618d2d082414023be9a3a8b632d671ae0d3a62582 + f64ab39a9d72dd005a639c2c499f3b41160e35dbb393b6ad2617ea634c820cca + 2ff2af55f39819212e70d2212c7c2063fb762d9a48de456c2139b09e6083a645 + 999a0205cd5d9ccdd38d9f053488baa175873fd204411bf7e1637a94f12bbe99 + d3a0811f266967a547c42a910f1246a5fa76a9b75f43e1d3f542a1f70b5a8975 + 78a0bdcc50bedd25a3597fc86f4bae5fca0861d26f47018b3e24a3ab327144fe + 9da8e6875e92ec0d13678c057bf9d65284bf80215ab9acb4abe10e1416841e9e + 0bd4a45ed69f2a4e9f11d2dc825e5cbbfd0b0b92b40266c4a148cb18ace8bfa8 + 696c360bfdf5dec736970dae9766991a980535c531adba6cf26d177da58866b8 + afc6d1941c483a2e3db7a6cdd84255f45dc3826c046fee3df80c5cb30e41a18d + 2bce1a4b6f09b99194d9488d28b53116a91d65005d10c118c5d3519c22178863 + 4426b845cf68f18904da64778f89b42f9c8903f959ace49444444040549fc496 + 313ac0e1247199a6de76590ae34df572d84dadafc01e1a1e4e27cb3c9298c0b4 + 0a3fbf9ab56ccc5a53da305dec68230303e218f9e6b1c541e4fe481b64a175d6 + 2bca4203624b1e29066b8bf5ce27cc2a5cc2032250cb7058767a21107e1689a5 + 3fd7b23c38b2dfb792829907b08b1ecb540504309d71bd631fecfba06bd5a88f + 0c7430c754d0afa86b14eff7e06171a385327bfd916667f02a3c3663e79c6ea0 + 7970b255b515693288aef1772eccb487d3d49dc4ab4ad3ce1acb68090df620d6 + f9d00dcef4164cfc663ed10607c6d84a3804727e4644fa7f6c2122b28799d5b7 + 04a1da1e2714893f0a6a54a61ecadd502b493ee7a12f5c7b4ce50d3fa29db2cf + 51500b6ecfb9f5eb4178dfcf6dd4910dce1b19207d853b935763d6042939b56c + f8072b2dd6ac27b08627ef731a42ac00e1aa1d6b315d60e6a8e17f3b73050fcc + 0c00f340c01e9e579aa92e5ae576741304e809cd4f4f6dbf973245779b7d94c3 + 4de06e0aef0d29e2c8dc79f3ba6ea088532eeda9735d77cb8a832c5173564c57 + d3cbb5d9d05aec3a8a596348985a7a8ff1bd8e0e3ea8bbb4b7a285be03b7d81c + 21ecb7a3e635e6d9cd75a8e3f2f295a15cedd14bce647361eae4aee99d385b61 + ebebd5b3dc3e9473ce1d82a16c204ee2fab9ddcde27ba8415eaac39cb0c7b09c + 82299a33596da5a7c1a68d66b13c2a2019a7b3482a017c308878ff6d1fa80b1c + 142ae9daba49e5b3a93355fad9977c0df3a5f69eb0e7c2192c77c50bfecb3d2c + f246f5871ec1e41274d7c49d5c2f0802b8006e2d1ea7408bcfebccd513ace2aa + 12b0033d0dc8b61cfbaf06a59808add8f8dd89061499a560fa71e068119bf407 + 67f0680c75ceed6a170b7b31b5b460a9f13b623027090305039c686783a8ce1f + 3cd0824a0a7118246df706612260c77b41ce86d697e9ce92ed7cdcea6fb12b41 + 89d46cafc9cb9bb73a1edac53b945e4790384d0b29c32f5ccd51750fefd2ac6a + c10b0feb61aaf28b99361a2915f3993d4414647a10e5c6ae280c7bc2680a0b38 + 670ec4854a94adbcfd2c20f530bced831749bc23a9fa794e42b6b21a4facbc9b + 22a8dfc9524b9343ce06e9d83af3880880b45144d1acc496b705fe1ba00d2a0d + b7ff2770a6138f7a5d239ea5c925d28e2bb5dd63f1c0de2f23ea5674df7e7b53 + 30f5a62041a177d7c1b20c05aa0982846856d981addb7f7610ffcf19767b9d13 + f6b3ec115e90797fe7844228b49a6de4b5f8af6866a2e45564a799b11a40046b + 20c8e3450eaa6ad7e932b5704c50d9444057f69e3ef7fd0fc3e7b050279c5eb4 + c5c075d7d2f63e437f8b6c51c76d99989aa5f9f686420dcc76df1561a4b4ab98 + 786e721ce8ce6fb504ebdbe4dc3c993ef9303374ab1864809216d650e33d05e3 + 7b7a400b21b8bf458b53ad7b85c32f1923431297ac1c8da079077f96f1a01627 + c6d6403f8d6afbff1e170ccb6d24cd56efa546e1dbf3af6379ac68bcceaca7a4 + a9851fab40cc03f2c3037c9f0ba5fd9bd698fb063fb8a3c7262a471d6663ae0e + 014ddb756bdc24abe1a483696a1c9b1b366294f09c107ab0e62256490ac59e1d + 4810617ebdfe2e79d237adedea68460bc284022dfba07d46a2ec712663dfad53"