From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7366CC433F5 for ; Thu, 3 Mar 2022 06:08:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229775AbiCCGJW (ORCPT ); Thu, 3 Mar 2022 01:09:22 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46950 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229468AbiCCGJV (ORCPT ); Thu, 3 Mar 2022 01:09:21 -0500 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E5926158E87; Wed, 2 Mar 2022 22:08:34 -0800 (PST) Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 2235Mj7l027039; Thu, 3 Mar 2022 06:07:17 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : in-reply-to : references : date : message-id : content-type : content-transfer-encoding : mime-version; s=pp1; bh=tAFo2nAVBHlJm3WcjxdMbljcwPYV8sMq6b92Cb6CE4k=; b=jnVcU8lBfvLwuVJpmTgJ5mT1SAtlcxDgfBsNv1Un6nzwd/gFRfOdIMh7db1SA1JJmPzd ynzEWS5zJeUKiHC6lKpfGBpkoEbQiV0MGQG+p3oblydwSzvoICLzGMAL7JilWdr1Rwvm ljYC3Ljar2SxIZu/vSJUZRvgXq3CHlmUAFVElqKr+KddJ4R4sLqwbfTE37ZYYBaz/0Ll X1ePODYgLIoL4iNLLYB8nl8Sdovf0mTKfuaNh5Hjj9Ud0Gy1vvpmV/wrzaGUEu9vV0Qm p3KxVqiHptc4TLOq8cNCrtfpNN3EENs0yK6X00RPmKkydImIl2ZvKviQ7C9KVUsPfG7U Cg== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3ejqfr0pjt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 03 Mar 2022 06:07:17 +0000 Received: from m0098394.ppops.net (m0098394.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 2235NL2D029716; Thu, 3 Mar 2022 06:07:16 GMT Received: from ppma03ams.nl.ibm.com (62.31.33a9.ip4.static.sl-reverse.com [169.51.49.98]) by mx0a-001b2d01.pphosted.com with ESMTP id 3ejqfr0phy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 03 Mar 2022 06:07:16 +0000 Received: from pps.filterd (ppma03ams.nl.ibm.com [127.0.0.1]) by ppma03ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 22364tR9020914; Thu, 3 Mar 2022 06:07:14 GMT Received: from b06cxnps4075.portsmouth.uk.ibm.com (d06relay12.portsmouth.uk.ibm.com [9.149.109.197]) by ppma03ams.nl.ibm.com with ESMTP id 3efbu9gthq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 03 Mar 2022 06:07:13 +0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 22367B5D34603464 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 3 Mar 2022 06:07:11 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4AD6E4C040; Thu, 3 Mar 2022 06:07:11 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CFC274C046; Thu, 3 Mar 2022 06:06:54 +0000 (GMT) Received: from vajain21.in.ibm.com (unknown [9.163.20.88]) by d06av22.portsmouth.uk.ibm.com (Postfix) with SMTP; Thu, 3 Mar 2022 06:06:54 +0000 (GMT) Received: by vajain21.in.ibm.com (sSMTP sendmail emulation); Thu, 03 Mar 2022 11:36:51 +0530 From: Vaibhav Jain To: Yu Zhao , Andrew Morton , Johannes Weiner , Mel Gorman , Michal Hocko Cc: Andi Kleen , Aneesh Kumar , Barry Song <21cnbao@gmail.com>, Catalin Marinas , Dave Hansen , Hillf Danton , Jens Axboe , Jesse Barnes , Jonathan Corbet , Linus Torvalds , Matthew Wilcox , Michael Larabel , Mike Rapoport , Rik van Riel , Vlastimil Babka , Will Deacon , Ying Huang , linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, page-reclaim@google.com, x86@kernel.org, Yu Zhao Subject: Re: [PATCH v7 00/12] Multigenerational LRU Framework In-Reply-To: <20220208081902.3550911-1-yuzhao@google.com> References: <20220208081902.3550911-1-yuzhao@google.com> Date: Thu, 03 Mar 2022 11:36:51 +0530 Message-ID: <87czj3mux0.fsf@vajain21.in.ibm.com> Content-Type: text/plain; charset=utf-8 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: FeXKMhmdtlwCLyty8s-Fq5RgMLRv5zGR X-Proofpoint-ORIG-GUID: H1XbNMky1SKwfWuu_TXkq8ftQ8J3pmpO Content-Transfer-Encoding: quoted-printable X-Proofpoint-UnRewURL: 0 URL was un-rewritten MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.816,Hydra:6.0.425,FMLib:17.11.64.514 definitions=2022-03-03_01,2022-02-26_01,2022-02-23_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 mlxscore=0 suspectscore=0 mlxlogscore=999 spamscore=0 malwarescore=0 adultscore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 clxscore=1011 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2201110000 definitions=main-2203030027 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In a synthetic MongoDB Benchmark (YCSB) seeing an average of ~19% throughput improvement on POWER10(Radix MMU + 64K Page Size) with MGLRU patches on top of v5.16 kernel for MongoDB + YCSB bench across three different request distriburions namely Exponential,Uniform and Zipfan Test-Results =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Average YCSB reported throughput (95% Confidence Interval): |---------------------+---------------------+---------------------+--------= -------------| | Kernel-Type | Exponential | Uniform | Zipfan = | |---------------------+---------------------+---------------------+--------= -------------| | Base Kernel (v5.16) | 27324.701 =C2=B1 759.652 | 20671.590 =C2=B1 412.974= | 37713.761 =C2=B1 621.213 | | v5.16 + MGLRU | 32702.231 =C2=B1 287.957 | 24916.239 =C2=B1 217.977= | 44308.839 =C2=B1 701.829 | |---------------------+---------------------+---------------------+--------= -------------| | Speedup | 19.68% =C2=B1 4.03% | 20.11% =C2=B1 2.95% = | 17.49% =C2=B1 2.82% | |---------------------+---------------------+---------------------+--------= -------------| n =3D 11 Samples x 3 (Distributions) x 2 (Kernels) =3D 66 Observations Test Environment =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Cpu: POWER10 (architected), altivec supported platform: pSeries CPUs: 32 MMU: Radix Page-Size: 64K Total-Memory: 64G Distro ------- # cat /etc/os-release NAME=3D"Red Hat Enterprise Linux" VERSION=3D"8.4 (Ootpa)" ID=3D"rhel" ID_LIKE=3D"fedora" VERSION_ID=3D"8.4" PLATFORM_ID=3D"platform:el8" PRETTY_NAME=3D"Red Hat Enterprise Linux 8.4 (Ootpa)" ANSI_COLOR=3D"0;31" CPE_NAME=3D"cpe:/o:redhat:enterprise_linux:8.4:GA" HOME_URL=3D"https://www.redhat.com/" DOCUMENTATION_URL=3D"https://access.redhat.com/documentation/red_hat_enterp= rise_linux/8/" BUG_REPORT_URL=3D"https://bugzilla.redhat.com/" REDHAT_BUGZILLA_PRODUCT=3D"Red Hat Enterprise Linux 8" REDHAT_BUGZILLA_PRODUCT_VERSION=3D8.4 REDHAT_SUPPORT_PRODUCT=3D"Red Hat Enterprise Linux" REDHAT_SUPPORT_PRODUCT_VERSION=3D"8.4" System-config ------------- # cat /sys/kernel/mm/transparent_hugepage/enabled always madvise [never] # cat /proc/swaps=20 Filename Type Size Use= d Priority /dev/dm-5 partition 10485696 940= 864 -2 # cat /proc/sys/vm/overcommit_memory 0 #cat /proc/cmdline systemd.unified_cgroup_hierarchy=3D1 transparent_huge= page=3Dnever MongoDB data partition ---------------------- lsblk /dev/sdb NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 128G 0 disk /data/mongodb mount | grep /dev/sdb /dev/sdb on /root/vajain21/mglru/data/mongodb type ext4 (rw,relatime) Testing Artifacts =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D MongoDB-configuration --------------------- MongoDB Commounity Server built from https://github.com/mongodb/mongo relea= se v5.0.6 # mongod --version db version v5.0.6 Build Info: { "version": "5.0.6", "gitVersion": "212a8dbb47f07427dae194a9c75baec1d81d9259", "openSSLVersion": "OpenSSL 1.1.1g FIPS 21 Apr 2020", "modules": [], "allocator": "tcmalloc", "environment": { "distarch": "ppc64le", "target_arch": "ppc64le" } } # cat /etc/mongod.conf=20 storage: dbPath: /data/mongodb journal: enabled: true engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 50 net: bindIp: 127.0.0.1 unixDomainSocket: enabled: true pathPrefix: /run/mongodb setParameter: enableLocalhostAuthBypass: true YCSB (https://github.com/vaibhav92/YCSB/tree/mongodb-domain-sockets) -------------------------------------------------------------------- YCSB forked from https://github.com/brianfrankcooper/YCSB.git. This fixes a problem with YCSB when trying to connect to MongoDB on a unix domain socket= . PR raised to the project at https://github.com/brianfrankcooper/YCSB/pull/1587 Head Commit: fb2555a77005ae70c26e4adc46c945caf4daa2f9(" [core] Generate classpath from all dependencies rather than just compile scoped") Kernel-Config ------------- Base-Kernel: https://github.com/torvalds/linux/ v5.16 Base-Kernel-Config: https://github.com/vaibhav92/mglru-benchmark/blob/auto_build/config-non-mgl= ru Test-Kernel: https://linux-mm.googlesource.com/page-reclaim refs/changes/49= /1549/1 Test-Kernel-Config: https://github.com/vaibhav92/mglru-benchmark/blob/auto_build/config-mglru CONFIG_LRU_GEN=3Dy CONFIG_LRU_GEN_ENABLED=3Dy CONFIG_NR_LRU_GENS=3D4 CONFIG_TIERS_PER_GEN=3D4 YCSB: recordcount=3D80000000 operationcount=3D80000000 readproportion=3D0.8 updateproportion=3D0.2 workload=3Dsite.ycsb.workloads.CoreWorkload threads=3D64 requestdistributions=3D{uniform, exponential, zipfian} Test-Bench =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Source: https://github.com/vaibhav92/mglru-benchmark/tree/auto_build Invoked via following command that will *destroy* contents of /dev/sdd and use it as data disk for MongoDB: $ export MONGODB_DISK=3D/dev/sdd; curl \ https://raw.githubusercontent.com/vaibhav92/mglru-benchmark/auto_build/buil= d.sh \ | sudo bash -s Test-Methodology =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Setup ----- 1. Pull & Build testing artifact v5.16 Base Kernel, MGLRU Kernel, MongoDB, YCSB & Qemu for qemu-img tools 2. Format and mount provided MongoDB Data disk with ext4. 3. Generate Systemd service/slice files for MongoDB and place them into /et= c/systemd/system/ 4. Generate MongoDB configration pointing to the data disk mount. 5. Start the built MongoDB instance. 6. Ensure that MongoDB is running. Load Test Data --------------- 1. Ensure that MongoDB instance is stopped. 2. Unmount the data disk and reformat it with ext4. 3. Restart MongoDB. 4. Spin off YCSB to load data into the Mongo instance. 5. Stop MongoDB + Unmount data Disk 6. Create a qcow2 image of the data disk and store it with test data. 7. Kexec into base kernel. Test Phase (Happens at each boot) --------------------------------- 1. Select the distribution to be used for YCSB from {"Uniform","Exponential","Zipfan"} 2. Restore the MongoDB qcow2 data disk Image to the disk 3. Mount the data disk and restart MongoDB daemon. 4. Start YCSB to generate the workload on MongoDB. 5. Once finished collect results. 6. Kexec into next-kernel which keeps switching between Base-Kernel & MGLRU-Kernel when all three distriutions have been tested. Setup and Load Test Data stages can be accomplished by following command: #export MONGODB_DISK=3D/dev/sdd; \ curl https://raw.githubusercontent.com/vaibhav92/mglru-benchmark/auto_build= /build.sh | bash -s Once completed successfully it will kexec into the base kernel and start the Test phase on boot via systemd service named 'mglru-benchmark' Based on above results, Tested-by: Vaibhav Jain Yu Zhao writes: > What's new > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > 1) Addressed all the comments received on the mailing list and in the > meeting with the stakeholders (will note on individual patches). > 2) Measured the performance improvements for each patch between 5-8 > (reported in the commit messages). > > TLDR > =3D=3D=3D=3D > The current page reclaim is too expensive in terms of CPU usage and it > often makes poor choices about what to evict. This patchset offers an > alternative solution that is performant, versatile and straightforward. > > Patchset overview > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > The design and implementation overview was moved to patch 12 so that > people can finish reading this cover letter. > > 1. mm: x86, arm64: add arch_has_hw_pte_young() > 2. mm: x86: add CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG > Using hardware optimizations when trying to clear the accessed bit in > many PTEs. > > 3. mm/vmscan.c: refactor shrink_node() > A minor refactor. > > 4. mm: multigenerational LRU: groundwork > Adding the basic data structure and the functions that insert/remove > pages to/from the multigenerational LRU (MGLRU) lists. > > 5. mm: multigenerational LRU: minimal implementation > A minimal (functional) implementation without any optimizations. > > 6. mm: multigenerational LRU: exploit locality in rmap > Improving the efficiency when using the rmap. > > 7. mm: multigenerational LRU: support page table walks > Adding the (optional) page table scanning. > > 8. mm: multigenerational LRU: optimize multiple memcgs > Optimizing the overall performance for multiple memcgs running mixed > types of workloads. > > 9. mm: multigenerational LRU: runtime switch > Adding a runtime switch to enable or disable MGLRU. > > 10. mm: multigenerational LRU: thrashing prevention > 11. mm: multigenerational LRU: debugfs interface > Providing userspace with additional features like thrashing prevention, > working set estimation and proactive reclaim. > > 12. mm: multigenerational LRU: documentation > Adding a design doc and an admin guide. > > Benchmark results > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > Independent lab results > ----------------------- > Based on the popularity of searches [01] and the memory usage in > Google's public cloud, the most popular open-source memory-hungry > applications, in alphabetical order, are: > Apache Cassandra Memcached > Apache Hadoop MongoDB > Apache Spark PostgreSQL > MariaDB (MySQL) Redis > > An independent lab evaluated MGLRU with the most widely used benchmark > suites for the above applications. They posted 960 data points along > with kernel metrics and perf profiles collected over more than 500 > hours of total benchmark time. Their final reports show that, with 95% > confidence intervals (CIs), the above applications all performed > significantly better for at least part of their benchmark matrices. > > On 5.14: > 1. Apache Spark [02] took 95% CIs [9.28, 11.19]% and [12.20, 14.93]% > less wall time to sort three billion random integers, respectively, > under the medium- and the high-concurrency conditions, when > overcommitting memory. There were no statistically significant > changes in wall time for the rest of the benchmark matrix. > 2. MariaDB [03] achieved 95% CIs [5.24, 10.71]% and [20.22, 25.97]% > more transactions per minute (TPM), respectively, under the medium- > and the high-concurrency conditions, when overcommitting memory. > There were no statistically significant changes in TPM for the rest > of the benchmark matrix. > 3. Memcached [04] achieved 95% CIs [23.54, 32.25]%, [20.76, 41.61]% > and [21.59, 30.02]% more operations per second (OPS), respectively, > for sequential access, random access and Gaussian (distribution) > access, when THP=3Dalways; 95% CIs [13.85, 15.97]% and > [23.94, 29.92]% more OPS, respectively, for random access and > Gaussian access, when THP=3Dnever. There were no statistically > significant changes in OPS for the rest of the benchmark matrix. > 4. MongoDB [05] achieved 95% CIs [2.23, 3.44]%, [6.97, 9.73]% and > [2.16, 3.55]% more operations per second (OPS), respectively, for > exponential (distribution) access, random access and Zipfian > (distribution) access, when underutilizing memory; 95% CIs > [8.83, 10.03]%, [21.12, 23.14]% and [5.53, 6.46]% more OPS, > respectively, for exponential access, random access and Zipfian > access, when overcommitting memory. > > On 5.15: > 5. Apache Cassandra [06] achieved 95% CIs [1.06, 4.10]%, [1.94, 5.43]% > and [4.11, 7.50]% more operations per second (OPS), respectively, > for exponential (distribution) access, random access and Zipfian > (distribution) access, when swap was off; 95% CIs [0.50, 2.60]%, > [6.51, 8.77]% and [3.29, 6.75]% more OPS, respectively, for > exponential access, random access and Zipfian access, when swap was > on. > 6. Apache Hadoop [07] took 95% CIs [5.31, 9.69]% and [2.02, 7.86]% > less average wall time to finish twelve parallel TeraSort jobs, > respectively, under the medium- and the high-concurrency > conditions, when swap was on. There were no statistically > significant changes in average wall time for the rest of the > benchmark matrix. > 7. PostgreSQL [08] achieved 95% CI [1.75, 6.42]% more transactions per > minute (TPM) under the high-concurrency condition, when swap was > off; 95% CIs [12.82, 18.69]% and [22.70, 46.86]% more TPM, > respectively, under the medium- and the high-concurrency > conditions, when swap was on. There were no statistically > significant changes in TPM for the rest of the benchmark matrix. > 8. Redis [09] achieved 95% CIs [0.58, 5.94]%, [6.55, 14.58]% and > [11.47, 19.36]% more total operations per second (OPS), > respectively, for sequential access, random access and Gaussian > (distribution) access, when THP=3Dalways; 95% CIs [1.27, 3.54]%, > [10.11, 14.81]% and [8.75, 13.64]% more total OPS, respectively, > for sequential access, random access and Gaussian access, when > THP=3Dnever. > > Our lab results > --------------- > To supplement the above results, we ran the following benchmark suites > on 5.16-rc7 and found no regressions [10]. (These synthetic benchmarks > are popular among MM developers, but we prefer large-scale A/B > experiments to validate improvements.) > fs_fio_bench_hdd_mq pft > fs_lmbench pgsql-hammerdb > fs_parallelio redis > fs_postmark stream > hackbench sysbenchthread > kernbench tpcc_spark > memcached unixbench > multichase vm-scalability > mutilate will-it-scale > nginx > > [01] https://trends.google.com > [02] https://lore.kernel.org/lkml/20211102002002.92051-1-bot@edi.works/ > [03] https://lore.kernel.org/lkml/20211009054315.47073-1-bot@edi.works/ > [04] https://lore.kernel.org/lkml/20211021194103.65648-1-bot@edi.works/ > [05] https://lore.kernel.org/lkml/20211109021346.50266-1-bot@edi.works/ > [06] https://lore.kernel.org/lkml/20211202062806.80365-1-bot@edi.works/ > [07] https://lore.kernel.org/lkml/20211209072416.33606-1-bot@edi.works/ > [08] https://lore.kernel.org/lkml/20211218071041.24077-1-bot@edi.works/ > [09] https://lore.kernel.org/lkml/20211122053248.57311-1-bot@edi.works/ > [10] https://lore.kernel.org/lkml/20220104202247.2903702-1-yuzhao@google.= com/ > > Read-world applications > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > Third-party testimonials > ------------------------ > Konstantin wrote [11]: > I have Archlinux with 8G RAM + zswap + swap. While developing, I > have lots of apps opened such as multiple LSP-servers for different > langs, chats, two browsers, etc... Usually, my system gets quickly > to a point of SWAP-storms, where I have to kill LSP-servers, > restart browsers to free memory, etc, otherwise the system lags > heavily and is barely usable. >=20=20=20=20 > 1.5 day ago I migrated from 5.11.15 kernel to 5.12 + the LRU > patchset, and I started up by opening lots of apps to create memory > pressure, and worked for a day like this. Till now I had *not a > single SWAP-storm*, and mind you I got 3.4G in SWAP. I was never > getting to the point of 3G in SWAP before without a single > SWAP-storm. > > An anonymous user wrote [12]: > Using that v5 for some time and confirm that difference under heavy > load and memory pressure is significant. > > Shuang wrote [13]: > With the MGLRU, fio achieved 95% CIs [38.95, 40.26]%, [4.12, 6.64]% > and [9.26, 10.36]% higher throughput, respectively, for random > access, Zipfian (distribution) access and Gaussian (distribution) > access, when the average number of jobs per CPU is 1; 95% CIs > [42.32, 49.15]%, [9.44, 9.89]% and [20.99, 22.86]% higher throughput, > respectively, for random access, Zipfian access and Gaussian access, > when the average number of jobs per CPU is 2. > > Daniel wrote [14]: > With memcached allocating ~100GB of byte-addressable Optante, > performance improvement in terms of throughput (measured as queries > per second) was about 10% for a series of workloads. > > Large-scale deployments > ----------------------- > The downstream kernels that have been using MGLRU include: > 1. Android ARCVM [15] > 2. Arch Linux Zen [16] > 3. Chrome OS [17] > 4. Liquorix [18] > 5. post-factum [19] > 6. XanMod [20] > > We've rolled out MGLRU to tens of millions of Chrome OS users and > about a million Android users. Google's fleetwide profiling [21] shows > an overall 40% decrease in kswapd CPU usage, in addition to > improvements in other UX metrics, e.g., an 85% decrease in the number > of low-memory kills at the 75th percentile and an 18% decrease in > rendering latency at the 50th percentile. > > [11] https://lore.kernel.org/lkml/140226722f2032c86301fbd326d91baefe3d7d2= 3.camel@yandex.ru/ > [12] https://phoronix.com/forums/forum/software/general-linux-open-source= /1301258-mglru-is-a-very-enticing-enhancement-for-linux-in-2022?p=3D1301275= #post1301275 > [13] https://lore.kernel.org/lkml/20220105024423.26409-1-szhai2@cs.roches= ter.edu/ > [14] https://lore.kernel.org/linux-mm/CA+4-3vksGvKd18FgRinxhqHetBS1hQekJE= 2gwco8Ja-bJWKtFw@mail.gmail.com/ > [15] https://chromium.googlesource.com/chromiumos/third_party/kernel > [16] https://archlinux.org > [17] https://chromium.org > [18] https://liquorix.net > [19] https://gitlab.com/post-factum/pf-kernel > [20] https://xanmod.org > [21] https://research.google/pubs/pub44271/ > > Summery > =3D=3D=3D=3D=3D=3D=3D > The facts are: > 1. The independent lab results and the real-world applications > indicate substantial improvements; there are no known regressions. > 2. Thrashing prevention, working set estimation and proactive reclaim > work out of the box; there are no equivalent solutions. > 3. There is a lot of new code; nobody has demonstrated smaller changes > with similar effects. > > Our options, accordingly, are: > 1. Given the amount of evidence, the reported improvements will likely > materialize for a wide range of workloads. > 2. Gauging the interest from the past discussions [22][23][24], the > new features will likely be put to use for both personal computers > and data centers. > 3. Based on Google's track record, the new code will likely be well > maintained in the long term. It'd be more difficult if not > impossible to achieve similar effects on top of the existing > design. > > [22] https://lore.kernel.org/lkml/20201005081313.732745-1-andrea.righi@ca= nonical.com/ > [23] https://lore.kernel.org/lkml/20210716081449.22187-1-sj38.park@gmail.= com/ > [24] https://lore.kernel.org/lkml/20211130201652.2218636d@mail.inbox.lv/ > > Yu Zhao (12): > mm: x86, arm64: add arch_has_hw_pte_young() > mm: x86: add CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG > mm/vmscan.c: refactor shrink_node() > mm: multigenerational LRU: groundwork > mm: multigenerational LRU: minimal implementation > mm: multigenerational LRU: exploit locality in rmap > mm: multigenerational LRU: support page table walks > mm: multigenerational LRU: optimize multiple memcgs > mm: multigenerational LRU: runtime switch > mm: multigenerational LRU: thrashing prevention > mm: multigenerational LRU: debugfs interface > mm: multigenerational LRU: documentation > > Documentation/admin-guide/mm/index.rst | 1 + > Documentation/admin-guide/mm/multigen_lru.rst | 121 + > Documentation/vm/index.rst | 1 + > Documentation/vm/multigen_lru.rst | 152 + > arch/Kconfig | 9 + > arch/arm64/include/asm/pgtable.h | 14 +- > arch/x86/Kconfig | 1 + > arch/x86/include/asm/pgtable.h | 9 +- > arch/x86/mm/pgtable.c | 5 +- > fs/exec.c | 2 + > fs/fuse/dev.c | 3 +- > include/linux/cgroup.h | 15 +- > include/linux/memcontrol.h | 36 + > include/linux/mm.h | 8 + > include/linux/mm_inline.h | 214 ++ > include/linux/mm_types.h | 78 + > include/linux/mmzone.h | 182 ++ > include/linux/nodemask.h | 1 + > include/linux/page-flags-layout.h | 19 +- > include/linux/page-flags.h | 4 +- > include/linux/pgtable.h | 17 +- > include/linux/sched.h | 4 + > include/linux/swap.h | 5 + > kernel/bounds.c | 3 + > kernel/cgroup/cgroup-internal.h | 1 - > kernel/exit.c | 1 + > kernel/fork.c | 9 + > kernel/sched/core.c | 1 + > mm/Kconfig | 50 + > mm/huge_memory.c | 3 +- > mm/memcontrol.c | 27 + > mm/memory.c | 39 +- > mm/mm_init.c | 6 +- > mm/page_alloc.c | 1 + > mm/rmap.c | 7 + > mm/swap.c | 55 +- > mm/vmscan.c | 2831 ++++++++++++++++- > mm/workingset.c | 119 +- > 38 files changed, 3908 insertions(+), 146 deletions(-) > create mode 100644 Documentation/admin-guide/mm/multigen_lru.rst > create mode 100644 Documentation/vm/multigen_lru.rst > > --=20 > 2.35.0.263.gb82422642f-goog > > --=20 Cheers ~ Vaibhav From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 26BC5C433F5 for ; Thu, 3 Mar 2022 06:09:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date:References :In-Reply-To:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=LS+9qOqhm9+ujSkr6wYG2QBxHotdGBIGhFrGIPmpvg0=; b=SqQ6YDlpuuY7vW jfNdqG0+n/3p+n5mZSZfJlFJ/AKe5XxksN5ruDrLGBVuWdbzsrvI5u3mDZpToF4utgW3w2qSUweAw fjEDrcOrymolOC0o3DeBdu/v0OEpaB2/yYmMtKQqhgjAihXd6OgUnPLQrYIyQpMmVtuld5AKRtU/7 BupmkxknmX89T2OuZLtpsfniLmNPM6YI2hBW1A4KoVDekZXcdb50CBEzHS3OUd62RahUsjCyvemfh +Chv9XxdP27EkK+S8U0ev19JKzTQesjQYC27f1JNWnp63rtd4bw9q78uYRdA4B/lrtqcOHt0pCVHx 3h/O+R8Fy2C5FvZ6nSkQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nPecv-005I91-9M; Thu, 03 Mar 2022 06:07:49 +0000 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nPecp-005I84-FE for linux-arm-kernel@lists.infradead.org; Thu, 03 Mar 2022 06:07:46 +0000 Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 2235Mj7l027039; Thu, 3 Mar 2022 06:07:17 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : in-reply-to : references : date : message-id : content-type : content-transfer-encoding : mime-version; s=pp1; bh=tAFo2nAVBHlJm3WcjxdMbljcwPYV8sMq6b92Cb6CE4k=; b=jnVcU8lBfvLwuVJpmTgJ5mT1SAtlcxDgfBsNv1Un6nzwd/gFRfOdIMh7db1SA1JJmPzd ynzEWS5zJeUKiHC6lKpfGBpkoEbQiV0MGQG+p3oblydwSzvoICLzGMAL7JilWdr1Rwvm ljYC3Ljar2SxIZu/vSJUZRvgXq3CHlmUAFVElqKr+KddJ4R4sLqwbfTE37ZYYBaz/0Ll X1ePODYgLIoL4iNLLYB8nl8Sdovf0mTKfuaNh5Hjj9Ud0Gy1vvpmV/wrzaGUEu9vV0Qm p3KxVqiHptc4TLOq8cNCrtfpNN3EENs0yK6X00RPmKkydImIl2ZvKviQ7C9KVUsPfG7U Cg== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3ejqfr0pjt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 03 Mar 2022 06:07:17 +0000 Received: from m0098394.ppops.net (m0098394.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 2235NL2D029716; Thu, 3 Mar 2022 06:07:16 GMT Received: from ppma03ams.nl.ibm.com (62.31.33a9.ip4.static.sl-reverse.com [169.51.49.98]) by mx0a-001b2d01.pphosted.com with ESMTP id 3ejqfr0phy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 03 Mar 2022 06:07:16 +0000 Received: from pps.filterd (ppma03ams.nl.ibm.com [127.0.0.1]) by ppma03ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 22364tR9020914; Thu, 3 Mar 2022 06:07:14 GMT Received: from b06cxnps4075.portsmouth.uk.ibm.com (d06relay12.portsmouth.uk.ibm.com [9.149.109.197]) by ppma03ams.nl.ibm.com with ESMTP id 3efbu9gthq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 03 Mar 2022 06:07:13 +0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 22367B5D34603464 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 3 Mar 2022 06:07:11 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4AD6E4C040; Thu, 3 Mar 2022 06:07:11 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CFC274C046; Thu, 3 Mar 2022 06:06:54 +0000 (GMT) Received: from vajain21.in.ibm.com (unknown [9.163.20.88]) by d06av22.portsmouth.uk.ibm.com (Postfix) with SMTP; Thu, 3 Mar 2022 06:06:54 +0000 (GMT) Received: by vajain21.in.ibm.com (sSMTP sendmail emulation); Thu, 03 Mar 2022 11:36:51 +0530 From: Vaibhav Jain To: Yu Zhao , Andrew Morton , Johannes Weiner , Mel Gorman , Michal Hocko Cc: Andi Kleen , Aneesh Kumar , Barry Song <21cnbao@gmail.com>, Catalin Marinas , Dave Hansen , Hillf Danton , Jens Axboe , Jesse Barnes , Jonathan Corbet , Linus Torvalds , Matthew Wilcox , Michael Larabel , Mike Rapoport , Rik van Riel , Vlastimil Babka , Will Deacon , Ying Huang , linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, page-reclaim@google.com, x86@kernel.org, Yu Zhao Subject: Re: [PATCH v7 00/12] Multigenerational LRU Framework In-Reply-To: <20220208081902.3550911-1-yuzhao@google.com> References: <20220208081902.3550911-1-yuzhao@google.com> Date: Thu, 03 Mar 2022 11:36:51 +0530 Message-ID: <87czj3mux0.fsf@vajain21.in.ibm.com> X-TM-AS-GCONF: 00 X-Proofpoint-GUID: FeXKMhmdtlwCLyty8s-Fq5RgMLRv5zGR X-Proofpoint-ORIG-GUID: H1XbNMky1SKwfWuu_TXkq8ftQ8J3pmpO X-Proofpoint-UnRewURL: 0 URL was un-rewritten MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.816,Hydra:6.0.425,FMLib:17.11.64.514 definitions=2022-03-03_01,2022-02-26_01,2022-02-23_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 mlxscore=0 suspectscore=0 mlxlogscore=999 spamscore=0 malwarescore=0 adultscore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 clxscore=1011 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2201110000 definitions=main-2203030027 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220302_220743_537130_36307225 X-CRM114-Status: GOOD ( 36.78 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org CkluIGEgc3ludGhldGljIE1vbmdvREIgQmVuY2htYXJrIChZQ1NCKSBzZWVpbmcgYW4gYXZlcmFn ZSBvZiB+MTklIHRocm91Z2hwdXQKaW1wcm92ZW1lbnQgb24gUE9XRVIxMChSYWRpeCBNTVUgKyA2 NEsgUGFnZSBTaXplKSB3aXRoIE1HTFJVIHBhdGNoZXMgb24KdG9wIG9mIHY1LjE2IGtlcm5lbCBm b3IgTW9uZ29EQiArIFlDU0IgYmVuY2ggYWNyb3NzIHRocmVlIGRpZmZlcmVudApyZXF1ZXN0IGRp c3RyaWJ1cmlvbnMgbmFtZWx5IEV4cG9uZW50aWFsLFVuaWZvcm0gYW5kIFppcGZhbgoKVGVzdC1S ZXN1bHRzCj09PT09PT09PT09PQoKQXZlcmFnZSBZQ1NCIHJlcG9ydGVkIHRocm91Z2hwdXQgKDk1 JSBDb25maWRlbmNlIEludGVydmFsKToKfC0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLXwK fCBLZXJuZWwtVHlwZSAgICAgICAgIHwgRXhwb25lbnRpYWwgICAgICAgICB8IFVuaWZvcm0gICAg ICAgICAgICAgfCBaaXBmYW4gICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0tLS0tLXwKfCBCYXNlIEtlcm5lbCAodjUuMTYpIHwgMjczMjQuNzAxIMKxIDc1OS42NTIgfCAy MDY3MS41OTAgwrEgNDEyLjk3NCB8IDM3NzEzLjc2MSDCsSA2MjEuMjEzIHwKfCB2NS4xNiArIE1H TFJVICAgICAgIHwgMzI3MDIuMjMxIMKxIDI4Ny45NTcgfCAyNDkxNi4yMzkgwrEgMjE3Ljk3NyB8 IDQ0MzA4LjgzOSDCsSA3MDEuODI5IHwKfC0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLXwK fCBTcGVlZHVwICAgICAgICAgICAgIHwgMTkuNjglIMKxIDQuMDMlICAgICAgfCAyMC4xMSUgwrEg Mi45NSUgICAgICB8IDE3LjQ5JSDCsSAyLjgyJSAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0tLS0tLXwKCm4gPSAxMSBTYW1wbGVzIHggMyAoRGlzdHJpYnV0aW9ucykgeCAyIChLZXJu ZWxzKSA9IDY2IE9ic2VydmF0aW9ucwoKVGVzdCBFbnZpcm9ubWVudAo9PT09PT09PT09PT09PT09 CkNwdTogUE9XRVIxMCAoYXJjaGl0ZWN0ZWQpLCBhbHRpdmVjIHN1cHBvcnRlZApwbGF0Zm9ybTog cFNlcmllcwpDUFVzOiAzMgpNTVU6IFJhZGl4ClBhZ2UtU2l6ZTogNjRLClRvdGFsLU1lbW9yeTog NjRHCgpEaXN0cm8KLS0tLS0tLQojIGNhdCAvZXRjL29zLXJlbGVhc2UKTkFNRT0iUmVkIEhhdCBF bnRlcnByaXNlIExpbnV4IgpWRVJTSU9OPSI4LjQgKE9vdHBhKSIKSUQ9InJoZWwiCklEX0xJS0U9 ImZlZG9yYSIKVkVSU0lPTl9JRD0iOC40IgpQTEFURk9STV9JRD0icGxhdGZvcm06ZWw4IgpQUkVU VFlfTkFNRT0iUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4IDguNCAoT290cGEpIgpBTlNJX0NPTE9S PSIwOzMxIgpDUEVfTkFNRT0iY3BlOi9vOnJlZGhhdDplbnRlcnByaXNlX2xpbnV4OjguNDpHQSIK SE9NRV9VUkw9Imh0dHBzOi8vd3d3LnJlZGhhdC5jb20vIgpET0NVTUVOVEFUSU9OX1VSTD0iaHR0 cHM6Ly9hY2Nlc3MucmVkaGF0LmNvbS9kb2N1bWVudGF0aW9uL3JlZF9oYXRfZW50ZXJwcmlzZV9s aW51eC84LyIKQlVHX1JFUE9SVF9VUkw9Imh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS8iCgpS RURIQVRfQlVHWklMTEFfUFJPRFVDVD0iUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4IDgiClJFREhB VF9CVUdaSUxMQV9QUk9EVUNUX1ZFUlNJT049OC40ClJFREhBVF9TVVBQT1JUX1BST0RVQ1Q9IlJl ZCBIYXQgRW50ZXJwcmlzZSBMaW51eCIKUkVESEFUX1NVUFBPUlRfUFJPRFVDVF9WRVJTSU9OPSI4 LjQiCgpTeXN0ZW0tY29uZmlnCi0tLS0tLS0tLS0tLS0KIyBjYXQgL3N5cy9rZXJuZWwvbW0vdHJh bnNwYXJlbnRfaHVnZXBhZ2UvZW5hYmxlZAphbHdheXMgbWFkdmlzZSBbbmV2ZXJdCgojIGNhdCAv cHJvYy9zd2FwcyAKRmlsZW5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUg ICAgICAgICAgICBTaXplICAgICAgICAgICAgVXNlZCAgICAgICAgICAgIFByaW9yaXR5Ci9kZXYv ZG0tNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24gICAgICAgMTA0ODU2 OTYgICAgICAgIDk0MDg2NCAgICAgICAgICAtMgoKIyBjYXQgL3Byb2Mvc3lzL3ZtL292ZXJjb21t aXRfbWVtb3J5CjAKCiNjYXQgL3Byb2MvY21kbGluZQo8ZXhpc3RpbmcgcGFyYW1ldGVycz4gc3lz dGVtZC51bmlmaWVkX2Nncm91cF9oaWVyYXJjaHk9MSB0cmFuc3BhcmVudF9odWdlcGFnZT1uZXZl cgoKTW9uZ29EQiBkYXRhIHBhcnRpdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmxzYmxrIC9k ZXYvc2RiCk5BTUUgTUFKOk1JTiBSTSAgU0laRSBSTyBUWVBFIE1PVU5UUE9JTlQKc2RiICAgIDg6 MTYgICAwICAxMjhHICAwIGRpc2sgPGhvbWU+L2RhdGEvbW9uZ29kYgoKbW91bnQgfCBncmVwIC9k ZXYvc2RiCi9kZXYvc2RiIG9uIC9yb290L3ZhamFpbjIxL21nbHJ1L2RhdGEvbW9uZ29kYiB0eXBl IGV4dDQgKHJ3LHJlbGF0aW1lKQoKVGVzdGluZyBBcnRpZmFjdHMKPT09PT09PT09PT09PT09PT09 CgpNb25nb0RCLWNvbmZpZ3VyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk1vbmdvREIgQ29t bW91bml0eSBTZXJ2ZXIgYnVpbHQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbW9uZ29kYi9tb25n byByZWxlYXNlIHY1LjAuNgoKIyBtb25nb2QgLS12ZXJzaW9uCmRiIHZlcnNpb24gdjUuMC42CkJ1 aWxkIEluZm86IHsKICAgICAgInZlcnNpb24iOiAiNS4wLjYiLAogICAgICAiZ2l0VmVyc2lvbiI6 ICIyMTJhOGRiYjQ3ZjA3NDI3ZGFlMTk0YTljNzViYWVjMWQ4MWQ5MjU5IiwKICAgICAgIm9wZW5T U0xWZXJzaW9uIjogIk9wZW5TU0wgMS4xLjFnIEZJUFMgIDIxIEFwciAyMDIwIiwKICAgICAgIm1v ZHVsZXMiOiBbXSwKICAgICAgImFsbG9jYXRvciI6ICJ0Y21hbGxvYyIsCiAgICAgICJlbnZpcm9u bWVudCI6IHsKICAgICAgImRpc3RhcmNoIjogInBwYzY0bGUiLAogICAgICAidGFyZ2V0X2FyY2gi OiAicHBjNjRsZSIKICAgICAgfQp9CgojIGNhdCAvZXRjL21vbmdvZC5jb25mIApzdG9yYWdlOgog IGRiUGF0aDogPGhvbWUtcGF0aD4vZGF0YS9tb25nb2RiCiAgam91cm5hbDoKICAgICBlbmFibGVk OiB0cnVlCiAgZW5naW5lOiB3aXJlZFRpZ2VyCiAgd2lyZWRUaWdlcjoKICAgIGVuZ2luZUNvbmZp ZzoKICAgIGNhY2hlU2l6ZUdCOiA1MAogIG5ldDoKICAgIGJpbmRJcDogMTI3LjAuMC4xCiAgICB1 bml4RG9tYWluU29ja2V0OgogICAgZW5hYmxlZDogdHJ1ZQogICAgcGF0aFByZWZpeDogL3J1bi9t b25nb2RiCnNldFBhcmFtZXRlcjoKICAgIGVuYWJsZUxvY2FsaG9zdEF1dGhCeXBhc3M6IHRydWUK CllDU0IgKGh0dHBzOi8vZ2l0aHViLmNvbS92YWliaGF2OTIvWUNTQi90cmVlL21vbmdvZGItZG9t YWluLXNvY2tldHMpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpZQ1NCIGZvcmtlZCBmcm9tIGh0dHBzOi8vZ2l0aHVi LmNvbS9icmlhbmZyYW5rY29vcGVyL1lDU0IuZ2l0LiBUaGlzIGZpeGVzIGEKcHJvYmxlbSB3aXRo IFlDU0Igd2hlbiB0cnlpbmcgdG8gY29ubmVjdCB0byBNb25nb0RCIG9uIGEgdW5peCBkb21haW4g c29ja2V0LiBQUgpyYWlzZWQgdG8gdGhlIHByb2plY3QgYXQgaHR0cHM6Ly9naXRodWIuY29tL2Jy aWFuZnJhbmtjb29wZXIvWUNTQi9wdWxsLzE1ODcKCkhlYWQgQ29tbWl0OiBmYjI1NTVhNzcwMDVh ZTcwYzI2ZTRhZGM0NmM5NDVjYWY0ZGFhMmY5KCIgW2NvcmVdIEdlbmVyYXRlCmNsYXNzcGF0aCBm cm9tIGFsbCBkZXBlbmRlbmNpZXMgcmF0aGVyIHRoYW4ganVzdCBjb21waWxlIHNjb3BlZCIpCgpL ZXJuZWwtQ29uZmlnCi0tLS0tLS0tLS0tLS0KCkJhc2UtS2VybmVsOiBodHRwczovL2dpdGh1Yi5j b20vdG9ydmFsZHMvbGludXgvIHY1LjE2CkJhc2UtS2VybmVsLUNvbmZpZzoKaHR0cHM6Ly9naXRo dWIuY29tL3ZhaWJoYXY5Mi9tZ2xydS1iZW5jaG1hcmsvYmxvYi9hdXRvX2J1aWxkL2NvbmZpZy1u b24tbWdscnUKClRlc3QtS2VybmVsOiBodHRwczovL2xpbnV4LW1tLmdvb2dsZXNvdXJjZS5jb20v cGFnZS1yZWNsYWltIHJlZnMvY2hhbmdlcy80OS8xNTQ5LzEKVGVzdC1LZXJuZWwtQ29uZmlnOgpo dHRwczovL2dpdGh1Yi5jb20vdmFpYmhhdjkyL21nbHJ1LWJlbmNobWFyay9ibG9iL2F1dG9fYnVp bGQvY29uZmlnLW1nbHJ1CgpDT05GSUdfTFJVX0dFTj15CkNPTkZJR19MUlVfR0VOX0VOQUJMRUQ9 eQpDT05GSUdfTlJfTFJVX0dFTlM9NApDT05GSUdfVElFUlNfUEVSX0dFTj00CgpZQ1NCOgpyZWNv cmRjb3VudD04MDAwMDAwMApvcGVyYXRpb25jb3VudD04MDAwMDAwMApyZWFkcHJvcG9ydGlvbj0w LjgKdXBkYXRlcHJvcG9ydGlvbj0wLjIKd29ya2xvYWQ9c2l0ZS55Y3NiLndvcmtsb2Fkcy5Db3Jl V29ya2xvYWQKdGhyZWFkcz02NApyZXF1ZXN0ZGlzdHJpYnV0aW9ucz17dW5pZm9ybSwgZXhwb25l bnRpYWwsIHppcGZpYW59CgpUZXN0LUJlbmNoCj09PT09PT09PT09ClNvdXJjZTogaHR0cHM6Ly9n aXRodWIuY29tL3ZhaWJoYXY5Mi9tZ2xydS1iZW5jaG1hcmsvdHJlZS9hdXRvX2J1aWxkCgpJbnZv a2VkIHZpYSBmb2xsb3dpbmcgY29tbWFuZCB0aGF0IHdpbGwgKmRlc3Ryb3kqIGNvbnRlbnRzIG9m IC9kZXYvc2RkCmFuZCB1c2UgaXQgYXMgZGF0YSBkaXNrIGZvciBNb25nb0RCOgoKJCBleHBvcnQg TU9OR09EQl9ESVNLPS9kZXYvc2RkOyBjdXJsIFwKaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRl bnQuY29tL3ZhaWJoYXY5Mi9tZ2xydS1iZW5jaG1hcmsvYXV0b19idWlsZC9idWlsZC5zaApcIHwg c3VkbyBiYXNoIC1zCgpUZXN0LU1ldGhvZG9sb2d5Cj09PT09PT09PT09PT09PT0KClNldHVwCi0t LS0tCjEuIFB1bGwgJiBCdWlsZCB0ZXN0aW5nIGFydGlmYWN0IHY1LjE2IEJhc2UgS2VybmVsLCBN R0xSVSBLZXJuZWwsCk1vbmdvREIsIFlDU0IgJiBRZW11IGZvciBxZW11LWltZyB0b29scwoyLiBG b3JtYXQgYW5kIG1vdW50IHByb3ZpZGVkIE1vbmdvREIgRGF0YSBkaXNrIHdpdGggZXh0NC4KMy4g R2VuZXJhdGUgU3lzdGVtZCBzZXJ2aWNlL3NsaWNlIGZpbGVzIGZvciBNb25nb0RCIGFuZCBwbGFj ZSB0aGVtIGludG8gL2V0Yy9zeXN0ZW1kL3N5c3RlbS8KNC4gR2VuZXJhdGUgTW9uZ29EQiBjb25m aWdyYXRpb24gcG9pbnRpbmcgdG8gdGhlIGRhdGEgZGlzayBtb3VudC4KNS4gU3RhcnQgdGhlIGJ1 aWx0IE1vbmdvREIgaW5zdGFuY2UuCjYuIEVuc3VyZSB0aGF0IE1vbmdvREIgaXMgcnVubmluZy4K CkxvYWQgVGVzdCBEYXRhCi0tLS0tLS0tLS0tLS0tLQoxLiBFbnN1cmUgdGhhdCBNb25nb0RCIGlu c3RhbmNlIGlzIHN0b3BwZWQuCjIuIFVubW91bnQgdGhlIGRhdGEgZGlzayBhbmQgcmVmb3JtYXQg aXQgd2l0aCBleHQ0LgozLiBSZXN0YXJ0IE1vbmdvREIuCjQuIFNwaW4gb2ZmIFlDU0IgdG8gbG9h ZCBkYXRhIGludG8gdGhlIE1vbmdvIGluc3RhbmNlLgo1LiBTdG9wIE1vbmdvREIgKyBVbm1vdW50 IGRhdGEgRGlzawo2LiBDcmVhdGUgYSBxY293MiBpbWFnZSBvZiB0aGUgZGF0YSBkaXNrIGFuZCBz dG9yZSBpdCB3aXRoIHRlc3QgZGF0YS4KNy4gS2V4ZWMgaW50byBiYXNlIGtlcm5lbC4KClRlc3Qg UGhhc2UgKEhhcHBlbnMgYXQgZWFjaCBib290KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KMS4gU2VsZWN0IHRoZSBkaXN0cmlidXRpb24gdG8gYmUgdXNlZCBmb3IgWUNTQiBmcm9t CnsiVW5pZm9ybSIsIkV4cG9uZW50aWFsIiwiWmlwZmFuIn0KMi4gUmVzdG9yZSB0aGUgTW9uZ29E QiBxY293MiBkYXRhIGRpc2sgSW1hZ2UgdG8gdGhlIGRpc2sKMy4gTW91bnQgdGhlIGRhdGEgZGlz ayBhbmQgcmVzdGFydCBNb25nb0RCIGRhZW1vbi4KNC4gU3RhcnQgWUNTQiB0byBnZW5lcmF0ZSB0 aGUgd29ya2xvYWQgb24gTW9uZ29EQi4KNS4gT25jZSBmaW5pc2hlZCBjb2xsZWN0IHJlc3VsdHMu CjYuIEtleGVjIGludG8gbmV4dC1rZXJuZWwgd2hpY2gga2VlcHMgc3dpdGNoaW5nIGJldHdlZW4g QmFzZS1LZXJuZWwgJgpNR0xSVS1LZXJuZWwgd2hlbiBhbGwgdGhyZWUgZGlzdHJpdXRpb25zIGhh dmUgYmVlbiB0ZXN0ZWQuCgpTZXR1cCBhbmQgTG9hZCBUZXN0IERhdGEgc3RhZ2VzIGNhbiBiZSBh Y2NvbXBsaXNoZWQgYnkgZm9sbG93aW5nIGNvbW1hbmQ6CiNleHBvcnQgTU9OR09EQl9ESVNLPS9k ZXYvc2RkOyBcCmN1cmwgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3ZhaWJoYXY5 Mi9tZ2xydS1iZW5jaG1hcmsvYXV0b19idWlsZC9idWlsZC5zaCB8IGJhc2ggLXMKCk9uY2UgY29t cGxldGVkIHN1Y2Nlc3NmdWxseSBpdCB3aWxsIGtleGVjIGludG8gdGhlIGJhc2Uga2VybmVsIGFu ZCBzdGFydCB0aGUKVGVzdCBwaGFzZSBvbiBib290IHZpYSBzeXN0ZW1kIHNlcnZpY2UgbmFtZWQg J21nbHJ1LWJlbmNobWFyaycKCkJhc2VkIG9uIGFib3ZlIHJlc3VsdHMsClRlc3RlZC1ieTogVmFp YmhhdiBKYWluPHZhaWJoYXZAbGludXguaWJtLmNvbT4KCll1IFpoYW8gPHl1emhhb0Bnb29nbGUu Y29tPiB3cml0ZXM6Cgo+IFdoYXQncyBuZXcKPiA9PT09PT09PT09Cj4gMSkgQWRkcmVzc2VkIGFs bCB0aGUgY29tbWVudHMgcmVjZWl2ZWQgb24gdGhlIG1haWxpbmcgbGlzdCBhbmQgaW4gdGhlCj4g ICAgbWVldGluZyB3aXRoIHRoZSBzdGFrZWhvbGRlcnMgKHdpbGwgbm90ZSBvbiBpbmRpdmlkdWFs IHBhdGNoZXMpLgo+IDIpIE1lYXN1cmVkIHRoZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgZm9y IGVhY2ggcGF0Y2ggYmV0d2VlbiA1LTgKPiAgICAocmVwb3J0ZWQgaW4gdGhlIGNvbW1pdCBtZXNz YWdlcykuCj4KPiBUTERSCj4gPT09PQo+IFRoZSBjdXJyZW50IHBhZ2UgcmVjbGFpbSBpcyB0b28g ZXhwZW5zaXZlIGluIHRlcm1zIG9mIENQVSB1c2FnZSBhbmQgaXQKPiBvZnRlbiBtYWtlcyBwb29y IGNob2ljZXMgYWJvdXQgd2hhdCB0byBldmljdC4gVGhpcyBwYXRjaHNldCBvZmZlcnMgYW4KPiBh bHRlcm5hdGl2ZSBzb2x1dGlvbiB0aGF0IGlzIHBlcmZvcm1hbnQsIHZlcnNhdGlsZSBhbmQgc3Ry YWlnaHRmb3J3YXJkLgo+Cj4gUGF0Y2hzZXQgb3ZlcnZpZXcKPiA9PT09PT09PT09PT09PT09PQo+ IFRoZSBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIG92ZXJ2aWV3IHdhcyBtb3ZlZCB0byBwYXRj aCAxMiBzbyB0aGF0Cj4gcGVvcGxlIGNhbiBmaW5pc2ggcmVhZGluZyB0aGlzIGNvdmVyIGxldHRl ci4KPgo+IDEuIG1tOiB4ODYsIGFybTY0OiBhZGQgYXJjaF9oYXNfaHdfcHRlX3lvdW5nKCkKPiAy LiBtbTogeDg2OiBhZGQgQ09ORklHX0FSQ0hfSEFTX05PTkxFQUZfUE1EX1lPVU5HCj4gVXNpbmcg aGFyZHdhcmUgb3B0aW1pemF0aW9ucyB3aGVuIHRyeWluZyB0byBjbGVhciB0aGUgYWNjZXNzZWQg Yml0IGluCj4gbWFueSBQVEVzLgo+Cj4gMy4gbW0vdm1zY2FuLmM6IHJlZmFjdG9yIHNocmlua19u b2RlKCkKPiBBIG1pbm9yIHJlZmFjdG9yLgo+Cj4gNC4gbW06IG11bHRpZ2VuZXJhdGlvbmFsIExS VTogZ3JvdW5kd29yawo+IEFkZGluZyB0aGUgYmFzaWMgZGF0YSBzdHJ1Y3R1cmUgYW5kIHRoZSBm dW5jdGlvbnMgdGhhdCBpbnNlcnQvcmVtb3ZlCj4gcGFnZXMgdG8vZnJvbSB0aGUgbXVsdGlnZW5l cmF0aW9uYWwgTFJVIChNR0xSVSkgbGlzdHMuCj4KPiA1LiBtbTogbXVsdGlnZW5lcmF0aW9uYWwg TFJVOiBtaW5pbWFsIGltcGxlbWVudGF0aW9uCj4gQSBtaW5pbWFsIChmdW5jdGlvbmFsKSBpbXBs ZW1lbnRhdGlvbiB3aXRob3V0IGFueSBvcHRpbWl6YXRpb25zLgo+Cj4gNi4gbW06IG11bHRpZ2Vu ZXJhdGlvbmFsIExSVTogZXhwbG9pdCBsb2NhbGl0eSBpbiBybWFwCj4gSW1wcm92aW5nIHRoZSBl ZmZpY2llbmN5IHdoZW4gdXNpbmcgdGhlIHJtYXAuCj4KPiA3LiBtbTogbXVsdGlnZW5lcmF0aW9u YWwgTFJVOiBzdXBwb3J0IHBhZ2UgdGFibGUgd2Fsa3MKPiBBZGRpbmcgdGhlIChvcHRpb25hbCkg cGFnZSB0YWJsZSBzY2FubmluZy4KPgo+IDguIG1tOiBtdWx0aWdlbmVyYXRpb25hbCBMUlU6IG9w dGltaXplIG11bHRpcGxlIG1lbWNncwo+IE9wdGltaXppbmcgdGhlIG92ZXJhbGwgcGVyZm9ybWFu Y2UgZm9yIG11bHRpcGxlIG1lbWNncyBydW5uaW5nIG1peGVkCj4gdHlwZXMgb2Ygd29ya2xvYWRz Lgo+Cj4gOS4gbW06IG11bHRpZ2VuZXJhdGlvbmFsIExSVTogcnVudGltZSBzd2l0Y2gKPiBBZGRp bmcgYSBydW50aW1lIHN3aXRjaCB0byBlbmFibGUgb3IgZGlzYWJsZSBNR0xSVS4KPgo+IDEwLiBt bTogbXVsdGlnZW5lcmF0aW9uYWwgTFJVOiB0aHJhc2hpbmcgcHJldmVudGlvbgo+IDExLiBtbTog bXVsdGlnZW5lcmF0aW9uYWwgTFJVOiBkZWJ1Z2ZzIGludGVyZmFjZQo+IFByb3ZpZGluZyB1c2Vy c3BhY2Ugd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzIGxpa2UgdGhyYXNoaW5nIHByZXZlbnRpb24s Cj4gd29ya2luZyBzZXQgZXN0aW1hdGlvbiBhbmQgcHJvYWN0aXZlIHJlY2xhaW0uCj4KPiAxMi4g bW06IG11bHRpZ2VuZXJhdGlvbmFsIExSVTogZG9jdW1lbnRhdGlvbgo+IEFkZGluZyBhIGRlc2ln biBkb2MgYW5kIGFuIGFkbWluIGd1aWRlLgo+Cj4gQmVuY2htYXJrIHJlc3VsdHMKPiA9PT09PT09 PT09PT09PT09PQo+IEluZGVwZW5kZW50IGxhYiByZXN1bHRzCj4gLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KPiBCYXNlZCBvbiB0aGUgcG9wdWxhcml0eSBvZiBzZWFyY2hlcyBbMDFdIGFuZCB0aGUg bWVtb3J5IHVzYWdlIGluCj4gR29vZ2xlJ3MgcHVibGljIGNsb3VkLCB0aGUgbW9zdCBwb3B1bGFy IG9wZW4tc291cmNlIG1lbW9yeS1odW5ncnkKPiBhcHBsaWNhdGlvbnMsIGluIGFscGhhYmV0aWNh bCBvcmRlciwgYXJlOgo+ICAgICAgIEFwYWNoZSBDYXNzYW5kcmEgICAgICBNZW1jYWNoZWQKPiAg ICAgICBBcGFjaGUgSGFkb29wICAgICAgICAgTW9uZ29EQgo+ICAgICAgIEFwYWNoZSBTcGFyayAg ICAgICAgICBQb3N0Z3JlU1FMCj4gICAgICAgTWFyaWFEQiAoTXlTUUwpICAgICAgIFJlZGlzCj4K PiBBbiBpbmRlcGVuZGVudCBsYWIgZXZhbHVhdGVkIE1HTFJVIHdpdGggdGhlIG1vc3Qgd2lkZWx5 IHVzZWQgYmVuY2htYXJrCj4gc3VpdGVzIGZvciB0aGUgYWJvdmUgYXBwbGljYXRpb25zLiBUaGV5 IHBvc3RlZCA5NjAgZGF0YSBwb2ludHMgYWxvbmcKPiB3aXRoIGtlcm5lbCBtZXRyaWNzIGFuZCBw ZXJmIHByb2ZpbGVzIGNvbGxlY3RlZCBvdmVyIG1vcmUgdGhhbiA1MDAKPiBob3VycyBvZiB0b3Rh bCBiZW5jaG1hcmsgdGltZS4gVGhlaXIgZmluYWwgcmVwb3J0cyBzaG93IHRoYXQsIHdpdGggOTUl Cj4gY29uZmlkZW5jZSBpbnRlcnZhbHMgKENJcyksIHRoZSBhYm92ZSBhcHBsaWNhdGlvbnMgYWxs IHBlcmZvcm1lZAo+IHNpZ25pZmljYW50bHkgYmV0dGVyIGZvciBhdCBsZWFzdCBwYXJ0IG9mIHRo ZWlyIGJlbmNobWFyayBtYXRyaWNlcy4KPgo+IE9uIDUuMTQ6Cj4gMS4gQXBhY2hlIFNwYXJrIFsw Ml0gdG9vayA5NSUgQ0lzIFs5LjI4LCAxMS4xOV0lIGFuZCBbMTIuMjAsIDE0LjkzXSUKPiAgICBs ZXNzIHdhbGwgdGltZSB0byBzb3J0IHRocmVlIGJpbGxpb24gcmFuZG9tIGludGVnZXJzLCByZXNw ZWN0aXZlbHksCj4gICAgdW5kZXIgdGhlIG1lZGl1bS0gYW5kIHRoZSBoaWdoLWNvbmN1cnJlbmN5 IGNvbmRpdGlvbnMsIHdoZW4KPiAgICBvdmVyY29tbWl0dGluZyBtZW1vcnkuIFRoZXJlIHdlcmUg bm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudAo+ICAgIGNoYW5nZXMgaW4gd2FsbCB0aW1lIGZv ciB0aGUgcmVzdCBvZiB0aGUgYmVuY2htYXJrIG1hdHJpeC4KPiAyLiBNYXJpYURCIFswM10gYWNo aWV2ZWQgOTUlIENJcyBbNS4yNCwgMTAuNzFdJSBhbmQgWzIwLjIyLCAyNS45N10lCj4gICAgbW9y ZSB0cmFuc2FjdGlvbnMgcGVyIG1pbnV0ZSAoVFBNKSwgcmVzcGVjdGl2ZWx5LCB1bmRlciB0aGUg bWVkaXVtLQo+ICAgIGFuZCB0aGUgaGlnaC1jb25jdXJyZW5jeSBjb25kaXRpb25zLCB3aGVuIG92 ZXJjb21taXR0aW5nIG1lbW9yeS4KPiAgICBUaGVyZSB3ZXJlIG5vIHN0YXRpc3RpY2FsbHkgc2ln bmlmaWNhbnQgY2hhbmdlcyBpbiBUUE0gZm9yIHRoZSByZXN0Cj4gICAgb2YgdGhlIGJlbmNobWFy ayBtYXRyaXguCj4gMy4gTWVtY2FjaGVkIFswNF0gYWNoaWV2ZWQgOTUlIENJcyBbMjMuNTQsIDMy LjI1XSUsIFsyMC43NiwgNDEuNjFdJQo+ICAgIGFuZCBbMjEuNTksIDMwLjAyXSUgbW9yZSBvcGVy YXRpb25zIHBlciBzZWNvbmQgKE9QUyksIHJlc3BlY3RpdmVseSwKPiAgICBmb3Igc2VxdWVudGlh bCBhY2Nlc3MsIHJhbmRvbSBhY2Nlc3MgYW5kIEdhdXNzaWFuIChkaXN0cmlidXRpb24pCj4gICAg YWNjZXNzLCB3aGVuIFRIUD1hbHdheXM7IDk1JSBDSXMgWzEzLjg1LCAxNS45N10lIGFuZAo+ICAg IFsyMy45NCwgMjkuOTJdJSBtb3JlIE9QUywgcmVzcGVjdGl2ZWx5LCBmb3IgcmFuZG9tIGFjY2Vz cyBhbmQKPiAgICBHYXVzc2lhbiBhY2Nlc3MsIHdoZW4gVEhQPW5ldmVyLiBUaGVyZSB3ZXJlIG5v IHN0YXRpc3RpY2FsbHkKPiAgICBzaWduaWZpY2FudCBjaGFuZ2VzIGluIE9QUyBmb3IgdGhlIHJl c3Qgb2YgdGhlIGJlbmNobWFyayBtYXRyaXguCj4gNC4gTW9uZ29EQiBbMDVdIGFjaGlldmVkIDk1 JSBDSXMgWzIuMjMsIDMuNDRdJSwgWzYuOTcsIDkuNzNdJSBhbmQKPiAgICBbMi4xNiwgMy41NV0l IG1vcmUgb3BlcmF0aW9ucyBwZXIgc2Vjb25kIChPUFMpLCByZXNwZWN0aXZlbHksIGZvcgo+ICAg IGV4cG9uZW50aWFsIChkaXN0cmlidXRpb24pIGFjY2VzcywgcmFuZG9tIGFjY2VzcyBhbmQgWmlw Zmlhbgo+ICAgIChkaXN0cmlidXRpb24pIGFjY2Vzcywgd2hlbiB1bmRlcnV0aWxpemluZyBtZW1v cnk7IDk1JSBDSXMKPiAgICBbOC44MywgMTAuMDNdJSwgWzIxLjEyLCAyMy4xNF0lIGFuZCBbNS41 MywgNi40Nl0lIG1vcmUgT1BTLAo+ICAgIHJlc3BlY3RpdmVseSwgZm9yIGV4cG9uZW50aWFsIGFj Y2VzcywgcmFuZG9tIGFjY2VzcyBhbmQgWmlwZmlhbgo+ICAgIGFjY2Vzcywgd2hlbiBvdmVyY29t bWl0dGluZyBtZW1vcnkuCj4KPiBPbiA1LjE1Ogo+IDUuIEFwYWNoZSBDYXNzYW5kcmEgWzA2XSBh Y2hpZXZlZCA5NSUgQ0lzIFsxLjA2LCA0LjEwXSUsIFsxLjk0LCA1LjQzXSUKPiAgICBhbmQgWzQu MTEsIDcuNTBdJSBtb3JlIG9wZXJhdGlvbnMgcGVyIHNlY29uZCAoT1BTKSwgcmVzcGVjdGl2ZWx5 LAo+ICAgIGZvciBleHBvbmVudGlhbCAoZGlzdHJpYnV0aW9uKSBhY2Nlc3MsIHJhbmRvbSBhY2Nl c3MgYW5kIFppcGZpYW4KPiAgICAoZGlzdHJpYnV0aW9uKSBhY2Nlc3MsIHdoZW4gc3dhcCB3YXMg b2ZmOyA5NSUgQ0lzIFswLjUwLCAyLjYwXSUsCj4gICAgWzYuNTEsIDguNzddJSBhbmQgWzMuMjks IDYuNzVdJSBtb3JlIE9QUywgcmVzcGVjdGl2ZWx5LCBmb3IKPiAgICBleHBvbmVudGlhbCBhY2Nl c3MsIHJhbmRvbSBhY2Nlc3MgYW5kIFppcGZpYW4gYWNjZXNzLCB3aGVuIHN3YXAgd2FzCj4gICAg b24uCj4gNi4gQXBhY2hlIEhhZG9vcCBbMDddIHRvb2sgOTUlIENJcyBbNS4zMSwgOS42OV0lIGFu ZCBbMi4wMiwgNy44Nl0lCj4gICAgbGVzcyBhdmVyYWdlIHdhbGwgdGltZSB0byBmaW5pc2ggdHdl bHZlIHBhcmFsbGVsIFRlcmFTb3J0IGpvYnMsCj4gICAgcmVzcGVjdGl2ZWx5LCB1bmRlciB0aGUg bWVkaXVtLSBhbmQgdGhlIGhpZ2gtY29uY3VycmVuY3kKPiAgICBjb25kaXRpb25zLCB3aGVuIHN3 YXAgd2FzIG9uLiBUaGVyZSB3ZXJlIG5vIHN0YXRpc3RpY2FsbHkKPiAgICBzaWduaWZpY2FudCBj aGFuZ2VzIGluIGF2ZXJhZ2Ugd2FsbCB0aW1lIGZvciB0aGUgcmVzdCBvZiB0aGUKPiAgICBiZW5j aG1hcmsgbWF0cml4Lgo+IDcuIFBvc3RncmVTUUwgWzA4XSBhY2hpZXZlZCA5NSUgQ0kgWzEuNzUs IDYuNDJdJSBtb3JlIHRyYW5zYWN0aW9ucyBwZXIKPiAgICBtaW51dGUgKFRQTSkgdW5kZXIgdGhl IGhpZ2gtY29uY3VycmVuY3kgY29uZGl0aW9uLCB3aGVuIHN3YXAgd2FzCj4gICAgb2ZmOyA5NSUg Q0lzIFsxMi44MiwgMTguNjldJSBhbmQgWzIyLjcwLCA0Ni44Nl0lIG1vcmUgVFBNLAo+ICAgIHJl c3BlY3RpdmVseSwgdW5kZXIgdGhlIG1lZGl1bS0gYW5kIHRoZSBoaWdoLWNvbmN1cnJlbmN5Cj4g ICAgY29uZGl0aW9ucywgd2hlbiBzd2FwIHdhcyBvbi4gVGhlcmUgd2VyZSBubyBzdGF0aXN0aWNh bGx5Cj4gICAgc2lnbmlmaWNhbnQgY2hhbmdlcyBpbiBUUE0gZm9yIHRoZSByZXN0IG9mIHRoZSBi ZW5jaG1hcmsgbWF0cml4Lgo+IDguIFJlZGlzIFswOV0gYWNoaWV2ZWQgOTUlIENJcyBbMC41OCwg NS45NF0lLCBbNi41NSwgMTQuNThdJSBhbmQKPiAgICBbMTEuNDcsIDE5LjM2XSUgbW9yZSB0b3Rh bCBvcGVyYXRpb25zIHBlciBzZWNvbmQgKE9QUyksCj4gICAgcmVzcGVjdGl2ZWx5LCBmb3Igc2Vx dWVudGlhbCBhY2Nlc3MsIHJhbmRvbSBhY2Nlc3MgYW5kIEdhdXNzaWFuCj4gICAgKGRpc3RyaWJ1 dGlvbikgYWNjZXNzLCB3aGVuIFRIUD1hbHdheXM7IDk1JSBDSXMgWzEuMjcsIDMuNTRdJSwKPiAg ICBbMTAuMTEsIDE0LjgxXSUgYW5kIFs4Ljc1LCAxMy42NF0lIG1vcmUgdG90YWwgT1BTLCByZXNw ZWN0aXZlbHksCj4gICAgZm9yIHNlcXVlbnRpYWwgYWNjZXNzLCByYW5kb20gYWNjZXNzIGFuZCBH YXVzc2lhbiBhY2Nlc3MsIHdoZW4KPiAgICBUSFA9bmV2ZXIuCj4KPiBPdXIgbGFiIHJlc3VsdHMK PiAtLS0tLS0tLS0tLS0tLS0KPiBUbyBzdXBwbGVtZW50IHRoZSBhYm92ZSByZXN1bHRzLCB3ZSBy YW4gdGhlIGZvbGxvd2luZyBiZW5jaG1hcmsgc3VpdGVzCj4gb24gNS4xNi1yYzcgYW5kIGZvdW5k IG5vIHJlZ3Jlc3Npb25zIFsxMF0uIChUaGVzZSBzeW50aGV0aWMgYmVuY2htYXJrcwo+IGFyZSBw b3B1bGFyIGFtb25nIE1NIGRldmVsb3BlcnMsIGJ1dCB3ZSBwcmVmZXIgbGFyZ2Utc2NhbGUgQS9C Cj4gZXhwZXJpbWVudHMgdG8gdmFsaWRhdGUgaW1wcm92ZW1lbnRzLikKPiAgICAgICBmc19maW9f YmVuY2hfaGRkX21xICAgICAgcGZ0Cj4gICAgICAgZnNfbG1iZW5jaCAgICAgICAgICAgICAgIHBn c3FsLWhhbW1lcmRiCj4gICAgICAgZnNfcGFyYWxsZWxpbyAgICAgICAgICAgIHJlZGlzCj4gICAg ICAgZnNfcG9zdG1hcmsgICAgICAgICAgICAgIHN0cmVhbQo+ICAgICAgIGhhY2tiZW5jaCAgICAg ICAgICAgICAgICBzeXNiZW5jaHRocmVhZAo+ICAgICAgIGtlcm5iZW5jaCAgICAgICAgICAgICAg ICB0cGNjX3NwYXJrCj4gICAgICAgbWVtY2FjaGVkICAgICAgICAgICAgICAgIHVuaXhiZW5jaAo+ ICAgICAgIG11bHRpY2hhc2UgICAgICAgICAgICAgICB2bS1zY2FsYWJpbGl0eQo+ICAgICAgIG11 dGlsYXRlICAgICAgICAgICAgICAgICB3aWxsLWl0LXNjYWxlCj4gICAgICAgbmdpbngKPgo+IFsw MV0gaHR0cHM6Ly90cmVuZHMuZ29vZ2xlLmNvbQo+IFswMl0gaHR0cHM6Ly9sb3JlLmtlcm5lbC5v cmcvbGttbC8yMDIxMTEwMjAwMjAwMi45MjA1MS0xLWJvdEBlZGkud29ya3MvCj4gWzAzXSBodHRw czovL2xvcmUua2VybmVsLm9yZy9sa21sLzIwMjExMDA5MDU0MzE1LjQ3MDczLTEtYm90QGVkaS53 b3Jrcy8KPiBbMDRdIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMTEwMjExOTQxMDMu NjU2NDgtMS1ib3RAZWRpLndvcmtzLwo+IFswNV0gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGtt bC8yMDIxMTEwOTAyMTM0Ni41MDI2Ni0xLWJvdEBlZGkud29ya3MvCj4gWzA2XSBodHRwczovL2xv cmUua2VybmVsLm9yZy9sa21sLzIwMjExMjAyMDYyODA2LjgwMzY1LTEtYm90QGVkaS53b3Jrcy8K PiBbMDddIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMTEyMDkwNzI0MTYuMzM2MDYt MS1ib3RAZWRpLndvcmtzLwo+IFswOF0gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGttbC8yMDIx MTIxODA3MTA0MS4yNDA3Ny0xLWJvdEBlZGkud29ya3MvCj4gWzA5XSBodHRwczovL2xvcmUua2Vy bmVsLm9yZy9sa21sLzIwMjExMTIyMDUzMjQ4LjU3MzExLTEtYm90QGVkaS53b3Jrcy8KPiBbMTBd IGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMjAxMDQyMDIyNDcuMjkwMzcwMi0xLXl1 emhhb0Bnb29nbGUuY29tLwo+Cj4gUmVhZC13b3JsZCBhcHBsaWNhdGlvbnMKPiA9PT09PT09PT09 PT09PT09PT09PT09PQo+IFRoaXJkLXBhcnR5IHRlc3RpbW9uaWFscwo+IC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQo+IEtvbnN0YW50aW4gd3JvdGUgWzExXToKPiAgICBJIGhhdmUgQXJjaGxpbnV4 IHdpdGggOEcgUkFNICsgenN3YXAgKyBzd2FwLiBXaGlsZSBkZXZlbG9waW5nLCBJCj4gICAgaGF2 ZSBsb3RzIG9mIGFwcHMgb3BlbmVkIHN1Y2ggYXMgbXVsdGlwbGUgTFNQLXNlcnZlcnMgZm9yIGRp ZmZlcmVudAo+ICAgIGxhbmdzLCBjaGF0cywgdHdvIGJyb3dzZXJzLCBldGMuLi4gVXN1YWxseSwg bXkgc3lzdGVtIGdldHMgcXVpY2tseQo+ICAgIHRvIGEgcG9pbnQgb2YgU1dBUC1zdG9ybXMsIHdo ZXJlIEkgaGF2ZSB0byBraWxsIExTUC1zZXJ2ZXJzLAo+ICAgIHJlc3RhcnQgYnJvd3NlcnMgdG8g ZnJlZSBtZW1vcnksIGV0Yywgb3RoZXJ3aXNlIHRoZSBzeXN0ZW0gbGFncwo+ICAgIGhlYXZpbHkg YW5kIGlzIGJhcmVseSB1c2FibGUuCj4gICAgCj4gICAgMS41IGRheSBhZ28gSSBtaWdyYXRlZCBm cm9tIDUuMTEuMTUga2VybmVsIHRvIDUuMTIgKyB0aGUgTFJVCj4gICAgcGF0Y2hzZXQsIGFuZCBJ IHN0YXJ0ZWQgdXAgYnkgb3BlbmluZyBsb3RzIG9mIGFwcHMgdG8gY3JlYXRlIG1lbW9yeQo+ICAg IHByZXNzdXJlLCBhbmQgd29ya2VkIGZvciBhIGRheSBsaWtlIHRoaXMuIFRpbGwgbm93IEkgaGFk ICpub3QgYQo+ICAgIHNpbmdsZSBTV0FQLXN0b3JtKiwgYW5kIG1pbmQgeW91IEkgZ290IDMuNEcg aW4gU1dBUC4gSSB3YXMgbmV2ZXIKPiAgICBnZXR0aW5nIHRvIHRoZSBwb2ludCBvZiAzRyBpbiBT V0FQIGJlZm9yZSB3aXRob3V0IGEgc2luZ2xlCj4gICAgU1dBUC1zdG9ybS4KPgo+IEFuIGFub255 bW91cyB1c2VyIHdyb3RlIFsxMl06Cj4gICAgVXNpbmcgdGhhdCB2NSBmb3Igc29tZSB0aW1lIGFu ZCBjb25maXJtIHRoYXQgZGlmZmVyZW5jZSB1bmRlciBoZWF2eQo+ICAgIGxvYWQgYW5kIG1lbW9y eSBwcmVzc3VyZSBpcyBzaWduaWZpY2FudC4KPgo+IFNodWFuZyB3cm90ZSBbMTNdOgo+ICAgIFdp dGggdGhlIE1HTFJVLCBmaW8gYWNoaWV2ZWQgOTUlIENJcyBbMzguOTUsIDQwLjI2XSUsIFs0LjEy LCA2LjY0XSUKPiAgICBhbmQgWzkuMjYsIDEwLjM2XSUgaGlnaGVyIHRocm91Z2hwdXQsIHJlc3Bl Y3RpdmVseSwgZm9yIHJhbmRvbQo+ICAgIGFjY2VzcywgWmlwZmlhbiAoZGlzdHJpYnV0aW9uKSBh Y2Nlc3MgYW5kIEdhdXNzaWFuIChkaXN0cmlidXRpb24pCj4gICAgYWNjZXNzLCB3aGVuIHRoZSBh dmVyYWdlIG51bWJlciBvZiBqb2JzIHBlciBDUFUgaXMgMTsgOTUlIENJcwo+ICAgIFs0Mi4zMiwg NDkuMTVdJSwgWzkuNDQsIDkuODldJSBhbmQgWzIwLjk5LCAyMi44Nl0lIGhpZ2hlciB0aHJvdWdo cHV0LAo+ICAgIHJlc3BlY3RpdmVseSwgZm9yIHJhbmRvbSBhY2Nlc3MsIFppcGZpYW4gYWNjZXNz IGFuZCBHYXVzc2lhbiBhY2Nlc3MsCj4gICAgd2hlbiB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygam9i cyBwZXIgQ1BVIGlzIDIuCj4KPiBEYW5pZWwgd3JvdGUgWzE0XToKPiAgICBXaXRoIG1lbWNhY2hl ZCBhbGxvY2F0aW5nIH4xMDBHQiBvZiBieXRlLWFkZHJlc3NhYmxlIE9wdGFudGUsCj4gICAgcGVy Zm9ybWFuY2UgaW1wcm92ZW1lbnQgaW4gdGVybXMgb2YgdGhyb3VnaHB1dCAobWVhc3VyZWQgYXMg cXVlcmllcwo+ICAgIHBlciBzZWNvbmQpIHdhcyBhYm91dCAxMCUgZm9yIGEgc2VyaWVzIG9mIHdv cmtsb2Fkcy4KPgo+IExhcmdlLXNjYWxlIGRlcGxveW1lbnRzCj4gLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KPiBUaGUgZG93bnN0cmVhbSBrZXJuZWxzIHRoYXQgaGF2ZSBiZWVuIHVzaW5nIE1HTFJV IGluY2x1ZGU6Cj4gMS4gQW5kcm9pZCBBUkNWTSBbMTVdCj4gMi4gQXJjaCBMaW51eCBaZW4gWzE2 XQo+IDMuIENocm9tZSBPUyBbMTddCj4gNC4gTGlxdW9yaXggWzE4XQo+IDUuIHBvc3QtZmFjdHVt IFsxOV0KPiA2LiBYYW5Nb2QgWzIwXQo+Cj4gV2UndmUgcm9sbGVkIG91dCBNR0xSVSB0byB0ZW5z IG9mIG1pbGxpb25zIG9mIENocm9tZSBPUyB1c2VycyBhbmQKPiBhYm91dCBhIG1pbGxpb24gQW5k cm9pZCB1c2Vycy4gR29vZ2xlJ3MgZmxlZXR3aWRlIHByb2ZpbGluZyBbMjFdIHNob3dzCj4gYW4g b3ZlcmFsbCA0MCUgZGVjcmVhc2UgaW4ga3N3YXBkIENQVSB1c2FnZSwgaW4gYWRkaXRpb24gdG8K PiBpbXByb3ZlbWVudHMgaW4gb3RoZXIgVVggbWV0cmljcywgZS5nLiwgYW4gODUlIGRlY3JlYXNl IGluIHRoZSBudW1iZXIKPiBvZiBsb3ctbWVtb3J5IGtpbGxzIGF0IHRoZSA3NXRoIHBlcmNlbnRp bGUgYW5kIGFuIDE4JSBkZWNyZWFzZSBpbgo+IHJlbmRlcmluZyBsYXRlbmN5IGF0IHRoZSA1MHRo IHBlcmNlbnRpbGUuCj4KPiBbMTFdIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xrbWwvMTQwMjI2 NzIyZjIwMzJjODYzMDFmYmQzMjZkOTFiYWVmZTNkN2QyMy5jYW1lbEB5YW5kZXgucnUvCj4gWzEy XSBodHRwczovL3Bob3Jvbml4LmNvbS9mb3J1bXMvZm9ydW0vc29mdHdhcmUvZ2VuZXJhbC1saW51 eC1vcGVuLXNvdXJjZS8xMzAxMjU4LW1nbHJ1LWlzLWEtdmVyeS1lbnRpY2luZy1lbmhhbmNlbWVu dC1mb3ItbGludXgtaW4tMjAyMj9wPTEzMDEyNzUjcG9zdDEzMDEyNzUKPiBbMTNdIGh0dHBzOi8v bG9yZS5rZXJuZWwub3JnL2xrbWwvMjAyMjAxMDUwMjQ0MjMuMjY0MDktMS1zemhhaTJAY3Mucm9j aGVzdGVyLmVkdS8KPiBbMTRdIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xpbnV4LW1tL0NBKzQt M3Zrc0d2S2QxOEZnUmlueGhxSGV0QlMxaFFla0pFMmd3Y284SmEtYkpXS3RGd0BtYWlsLmdtYWls LmNvbS8KPiBbMTVdIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bW9z L3RoaXJkX3BhcnR5L2tlcm5lbAo+IFsxNl0gaHR0cHM6Ly9hcmNobGludXgub3JnCj4gWzE3XSBo dHRwczovL2Nocm9taXVtLm9yZwo+IFsxOF0gaHR0cHM6Ly9saXF1b3JpeC5uZXQKPiBbMTldIGh0 dHBzOi8vZ2l0bGFiLmNvbS9wb3N0LWZhY3R1bS9wZi1rZXJuZWwKPiBbMjBdIGh0dHBzOi8veGFu bW9kLm9yZwo+IFsyMV0gaHR0cHM6Ly9yZXNlYXJjaC5nb29nbGUvcHVicy9wdWI0NDI3MS8KPgo+ IFN1bW1lcnkKPiA9PT09PT09Cj4gVGhlIGZhY3RzIGFyZToKPiAxLiBUaGUgaW5kZXBlbmRlbnQg bGFiIHJlc3VsdHMgYW5kIHRoZSByZWFsLXdvcmxkIGFwcGxpY2F0aW9ucwo+ICAgIGluZGljYXRl IHN1YnN0YW50aWFsIGltcHJvdmVtZW50czsgdGhlcmUgYXJlIG5vIGtub3duIHJlZ3Jlc3Npb25z Lgo+IDIuIFRocmFzaGluZyBwcmV2ZW50aW9uLCB3b3JraW5nIHNldCBlc3RpbWF0aW9uIGFuZCBw cm9hY3RpdmUgcmVjbGFpbQo+ICAgIHdvcmsgb3V0IG9mIHRoZSBib3g7IHRoZXJlIGFyZSBubyBl cXVpdmFsZW50IHNvbHV0aW9ucy4KPiAzLiBUaGVyZSBpcyBhIGxvdCBvZiBuZXcgY29kZTsgbm9i b2R5IGhhcyBkZW1vbnN0cmF0ZWQgc21hbGxlciBjaGFuZ2VzCj4gICAgd2l0aCBzaW1pbGFyIGVm ZmVjdHMuCj4KPiBPdXIgb3B0aW9ucywgYWNjb3JkaW5nbHksIGFyZToKPiAxLiBHaXZlbiB0aGUg YW1vdW50IG9mIGV2aWRlbmNlLCB0aGUgcmVwb3J0ZWQgaW1wcm92ZW1lbnRzIHdpbGwgbGlrZWx5 Cj4gICAgbWF0ZXJpYWxpemUgZm9yIGEgd2lkZSByYW5nZSBvZiB3b3JrbG9hZHMuCj4gMi4gR2F1 Z2luZyB0aGUgaW50ZXJlc3QgZnJvbSB0aGUgcGFzdCBkaXNjdXNzaW9ucyBbMjJdWzIzXVsyNF0s IHRoZQo+ICAgIG5ldyBmZWF0dXJlcyB3aWxsIGxpa2VseSBiZSBwdXQgdG8gdXNlIGZvciBib3Ro IHBlcnNvbmFsIGNvbXB1dGVycwo+ICAgIGFuZCBkYXRhIGNlbnRlcnMuCj4gMy4gQmFzZWQgb24g R29vZ2xlJ3MgdHJhY2sgcmVjb3JkLCB0aGUgbmV3IGNvZGUgd2lsbCBsaWtlbHkgYmUgd2VsbAo+ ICAgIG1haW50YWluZWQgaW4gdGhlIGxvbmcgdGVybS4gSXQnZCBiZSBtb3JlIGRpZmZpY3VsdCBp ZiBub3QKPiAgICBpbXBvc3NpYmxlIHRvIGFjaGlldmUgc2ltaWxhciBlZmZlY3RzIG9uIHRvcCBv ZiB0aGUgZXhpc3RpbmcKPiAgICBkZXNpZ24uCj4KPiBbMjJdIGh0dHBzOi8vbG9yZS5rZXJuZWwu b3JnL2xrbWwvMjAyMDEwMDUwODEzMTMuNzMyNzQ1LTEtYW5kcmVhLnJpZ2hpQGNhbm9uaWNhbC5j b20vCj4gWzIzXSBodHRwczovL2xvcmUua2VybmVsLm9yZy9sa21sLzIwMjEwNzE2MDgxNDQ5LjIy MTg3LTEtc2ozOC5wYXJrQGdtYWlsLmNvbS8KPiBbMjRdIGh0dHBzOi8vbG9yZS5rZXJuZWwub3Jn L2xrbWwvMjAyMTExMzAyMDE2NTIuMjIxODYzNmRAbWFpbC5pbmJveC5sdi8KPgo+IFl1IFpoYW8g KDEyKToKPiAgIG1tOiB4ODYsIGFybTY0OiBhZGQgYXJjaF9oYXNfaHdfcHRlX3lvdW5nKCkKPiAg IG1tOiB4ODY6IGFkZCBDT05GSUdfQVJDSF9IQVNfTk9OTEVBRl9QTURfWU9VTkcKPiAgIG1tL3Zt c2Nhbi5jOiByZWZhY3RvciBzaHJpbmtfbm9kZSgpCj4gICBtbTogbXVsdGlnZW5lcmF0aW9uYWwg TFJVOiBncm91bmR3b3JrCj4gICBtbTogbXVsdGlnZW5lcmF0aW9uYWwgTFJVOiBtaW5pbWFsIGlt cGxlbWVudGF0aW9uCj4gICBtbTogbXVsdGlnZW5lcmF0aW9uYWwgTFJVOiBleHBsb2l0IGxvY2Fs aXR5IGluIHJtYXAKPiAgIG1tOiBtdWx0aWdlbmVyYXRpb25hbCBMUlU6IHN1cHBvcnQgcGFnZSB0 YWJsZSB3YWxrcwo+ICAgbW06IG11bHRpZ2VuZXJhdGlvbmFsIExSVTogb3B0aW1pemUgbXVsdGlw bGUgbWVtY2dzCj4gICBtbTogbXVsdGlnZW5lcmF0aW9uYWwgTFJVOiBydW50aW1lIHN3aXRjaAo+ ICAgbW06IG11bHRpZ2VuZXJhdGlvbmFsIExSVTogdGhyYXNoaW5nIHByZXZlbnRpb24KPiAgIG1t OiBtdWx0aWdlbmVyYXRpb25hbCBMUlU6IGRlYnVnZnMgaW50ZXJmYWNlCj4gICBtbTogbXVsdGln ZW5lcmF0aW9uYWwgTFJVOiBkb2N1bWVudGF0aW9uCj4KPiAgRG9jdW1lbnRhdGlvbi9hZG1pbi1n dWlkZS9tbS9pbmRleC5yc3QgICAgICAgIHwgICAgMSArCj4gIERvY3VtZW50YXRpb24vYWRtaW4t Z3VpZGUvbW0vbXVsdGlnZW5fbHJ1LnJzdCB8ICAxMjEgKwo+ICBEb2N1bWVudGF0aW9uL3ZtL2lu ZGV4LnJzdCAgICAgICAgICAgICAgICAgICAgfCAgICAxICsKPiAgRG9jdW1lbnRhdGlvbi92bS9t dWx0aWdlbl9scnUucnN0ICAgICAgICAgICAgIHwgIDE1MiArCj4gIGFyY2gvS2NvbmZpZyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDkgKwo+ICBhcmNoL2FybTY0L2luY2x1 ZGUvYXNtL3BndGFibGUuaCAgICAgICAgICAgICAgfCAgIDE0ICstCj4gIGFyY2gveDg2L0tjb25m aWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEgKwo+ICBhcmNoL3g4Ni9pbmNs dWRlL2FzbS9wZ3RhYmxlLmggICAgICAgICAgICAgICAgfCAgICA5ICstCj4gIGFyY2gveDg2L21t L3BndGFibGUuYyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDUgKy0KPiAgZnMvZXhlYy5j ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMiArCj4gIGZzL2Z1c2Uv ZGV2LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDMgKy0KPiAgaW5jbHVk ZS9saW51eC9jZ3JvdXAuaCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxNSArLQo+ICBpbmNs dWRlL2xpbnV4L21lbWNvbnRyb2wuaCAgICAgICAgICAgICAgICAgICAgfCAgIDM2ICsKPiAgaW5j bHVkZS9saW51eC9tbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgOCArCj4gIGlu Y2x1ZGUvbGludXgvbW1faW5saW5lLmggICAgICAgICAgICAgICAgICAgICB8ICAyMTQgKysKPiAg aW5jbHVkZS9saW51eC9tbV90eXBlcy5oICAgICAgICAgICAgICAgICAgICAgIHwgICA3OCArCj4g IGluY2x1ZGUvbGludXgvbW16b25lLmggICAgICAgICAgICAgICAgICAgICAgICB8ICAxODIgKysK PiAgaW5jbHVkZS9saW51eC9ub2RlbWFzay5oICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSAr Cj4gIGluY2x1ZGUvbGludXgvcGFnZS1mbGFncy1sYXlvdXQuaCAgICAgICAgICAgICB8ICAgMTkg Ky0KPiAgaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmggICAgICAgICAgICAgICAgICAgIHwgICAg NCArLQo+ICBpbmNsdWRlL2xpbnV4L3BndGFibGUuaCAgICAgICAgICAgICAgICAgICAgICAgfCAg IDE3ICstCj4gIGluY2x1ZGUvbGludXgvc2NoZWQuaCAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgIDQgKwo+ICBpbmNsdWRlL2xpbnV4L3N3YXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAg fCAgICA1ICsKPiAga2VybmVsL2JvdW5kcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgMyArCj4gIGtlcm5lbC9jZ3JvdXAvY2dyb3VwLWludGVybmFsLmggICAgICAgICAgICAg ICB8ICAgIDEgLQo+ICBrZXJuZWwvZXhpdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCAgICAxICsKPiAga2VybmVsL2ZvcmsuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgICAgOSArCj4gIGtlcm5lbC9zY2hlZC9jb3JlLmMgICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAgIDEgKwo+ICBtbS9LY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAgIDUwICsKPiAgbW0vaHVnZV9tZW1vcnkuYyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgICAgMyArLQo+ICBtbS9tZW1jb250cm9sLmMgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCAgIDI3ICsKPiAgbW0vbWVtb3J5LmMgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgICAzOSArLQo+ICBtbS9tbV9pbml0LmMgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAgICA2ICstCj4gIG1tL3BhZ2VfYWxsb2MuYyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgIDEgKwo+ICBtbS9ybWFwLmMgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICA3ICsKPiAgbW0vc3dhcC5jICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgICA1NSArLQo+ICBtbS92bXNjYW4uYyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCAyODMxICsrKysrKysrKysrKysrKystCj4gIG1tL3dvcmtpbmdz ZXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMTkgKy0KPiAgMzggZmlsZXMg Y2hhbmdlZCwgMzkwOCBpbnNlcnRpb25zKCspLCAxNDYgZGVsZXRpb25zKC0pCj4gIGNyZWF0ZSBt b2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21tL211bHRpZ2VuX2xydS5yc3QK PiAgY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRpb24vdm0vbXVsdGlnZW5fbHJ1LnJzdAo+ Cj4gLS0gCj4gMi4zNS4wLjI2My5nYjgyNDIyNjQyZi1nb29nCj4KPgoKLS0gCkNoZWVycwp+IFZh aWJoYXYKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxp bnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFk ZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4 LWFybS1rZXJuZWwK