From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757603AbaGYGB0 (ORCPT ); Fri, 25 Jul 2014 02:01:26 -0400 Received: from cn.fujitsu.com ([59.151.112.132]:3233 "EHLO heian.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1753813AbaGYGBZ convert rfc822-to-8bit (ORCPT ); Fri, 25 Jul 2014 02:01:25 -0400 X-IronPort-AV: E=Sophos;i="5.00,959,1396972800"; d="scan'208";a="33765383" Message-ID: <53D1EFD3.3070905@cn.fujitsu.com> Date: Fri, 25 Jul 2014 13:49:07 +0800 From: Gu Zheng User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1 MIME-Version: 1.0 To: Chao Yu CC: "'Andrey Tsyvarev'" , "'Jaegeuk Kim'" , "'linux-kernel'" , "'Alexey Khoroshilov'" , Subject: Re: [f2fs-dev] f2fs: Possible use-after-free when umount filesystem References: <52F320FC.50803@ispras.ru> <534BC29B.3020408@ispras.ru> <53CCF1EC.30008@ispras.ru> <53CDC9AF.2050605@cn.fujitsu.com> <53CE3722.60307@ispras.ru> <000001cfa61b$c693b350$53bb19f0$@samsung.com> <53CF2E61.3000601@cn.fujitsu.com> <53D0DC8C.7050406@ispras.ru> <002a01cfa7b7$d79edc40$86dc94c0$@samsung.com> In-Reply-To: <002a01cfa7b7$d79edc40$86dc94c0$@samsung.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT X-Originating-IP: [10.167.226.100] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 07/25/2014 11:22 AM, Chao Yu wrote: > Hi, > > To Andrey: > Thanks for your test on this patch! > > To Gu: > If you do not object, let me make and resend a patch base on the one which > skip invalidating pages. Please go ahead.:) Thanks, Gu > > Regards, > Yu > >> -----Original Message----- >> From: Andrey Tsyvarev [mailto:tsyvarev@ispras.ru] >> Sent: Thursday, July 24, 2014 6:15 PM >> To: Gu Zheng; Chao Yu >> Cc: 'Jaegeuk Kim'; 'linux-kernel'; 'Alexey Khoroshilov'; >> linux-f2fs-devel@lists.sourceforge.net >> Subject: Re: [f2fs-dev] f2fs: Possible use-after-free when umount filesystem >> >> Hi, >> >> With patch skipping invalidating pages for node_inode and meta_inode >> use-after-free error disappears too. >> >> 23.07.2014 7:39, Gu Zheng пишет: >>> Hi, >>> On 07/23/2014 10:12 AM, Chao Yu wrote: >>> >>>> Hi Andrey Gu, >>>> >>>>> -----Original Message----- >>>>> From: Andrey Tsyvarev [mailto:tsyvarev@ispras.ru] >>>>> Sent: Tuesday, July 22, 2014 6:04 PM >>>>> To: Gu Zheng >>>>> Cc: Jaegeuk Kim; linux-kernel; Alexey Khoroshilov; linux-f2fs-devel@lists.sourceforge.net >>>>> Subject: Re: [f2fs-dev] f2fs: Possible use-after-free when umount filesystem >>>>> >>>>> Hi Gu, >>>>> >>>>>>> Investigation shows, that f2fs_evict_inode, when called for 'meta_inode', uses >>>>> invalidate_mapping_pages() for 'node_inode'. >>>>>>> But 'node_inode' is deleted before 'meta_inode' in f2fs_put_super via iput(). >>>>>>> >>>>>>> It seems that in common usage scenario this use-after-free is benign, because 'node_inode' >>>>> remains partially valid data even after kmem_cache_free(). >>>>>>> But things may change if, while 'meta_inode' is evicted in one f2fs filesystem, another >> (mounted) >>>>> f2fs filesystem requests inode from cache, and formely >>>>>>> 'node_inode' of the first filesystem is returned. >>>>>> The analysis seems reasonable. Have you tried to swap the reclaim order of node_inde >>>>>> and meta_inode? >>>>>> >>>>>> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c >>>>>> index 870fe19..e114418 100644 >>>>>> --- a/fs/f2fs/super.c >>>>>> +++ b/fs/f2fs/super.c >>>>>> @@ -430,8 +430,8 @@ static void f2fs_put_super(struct super_block *sb) >>>>>> if (sbi->s_dirty && get_pages(sbi, F2FS_DIRTY_NODES)) >>>>>> write_checkpoint(sbi, true); >>>>>> >>>>>> - iput(sbi->node_inode); >>>>>> iput(sbi->meta_inode); >>>>>> + iput(sbi->node_inode); >>>>>> >>>>>> /* destroy f2fs internal modules */ >>>>>> destroy_node_manager(sbi); >>>>>> >>>>>> Thanks, >>>>>> Gu >>>>> With reclaim order of node_inode and meta_inode swapped, use-after-free >>>>> error disappears. >>>>> >>>>> But shouldn't initialization order of these inodes be swapped too? >>>>> As meta_inode uses node_inode, it seems logical that it should be >>>>> initialized after it. >>> The initialization order dose not affect anything, so swapping the order dose not >>> make more sense here. >>> >>>> IMO, it's not easy to exchange order of initialization between meta_inode and >>>> node_inode, because we should use meta_inode in get_valid_checkpoint for valid >>>> cp first for usual verification, then init node_inode. >>> Yeah, but I think just moving node_inode's initialization to the front of meta_inode >>> dose not break anything. >>> >>>> As I checked, nids for both meta_inode and node_inode are reservation, so it's not >>>> necessary for us to invalidate pages which will never alloced. >>>> >>>> How about skipping it as following? >>> It seems the right way to fix this issue. >>> >>> To Andrey: >>> Could you please try this one? >>> >>> Thanks, >>> Gu >>> >>>> diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c >>>> index 2cf6962..cafba3c 100644 >>>> --- a/fs/f2fs/inode.c >>>> +++ b/fs/f2fs/inode.c >>>> @@ -273,7 +273,7 @@ void f2fs_evict_inode(struct inode *inode) >>>> >>>> if (inode->i_ino == F2FS_NODE_INO(sbi) || >>>> inode->i_ino == F2FS_META_INO(sbi)) >>>> - goto no_delete; >>>> + goto out_clear; >>>> >>>> f2fs_bug_on(get_dirty_dents(inode)); >>>> remove_dirty_dir_inode(inode); >>>> @@ -295,6 +295,7 @@ void f2fs_evict_inode(struct inode *inode) >>>> >>>> sb_end_intwrite(inode->i_sb); >>>> no_delete: >>>> - clear_inode(inode); >>>> invalidate_mapping_pages(NODE_MAPPING(sbi), inode->i_ino, inode->i_ino); >>>> +out_clear: >>>> + clear_inode(inode); >>>> } >>>> >>>>> -- >>>>> Best regards, >>>>> >>>>> Andrey Tsyvarev >>>>> Linux Verification Center, ISPRAS >>>>> web:http://linuxtesting.org >>>>> >>>>> >>>>> ------------------------------------------------------------------------------ >>>>> Want fast and easy access to all the code in your enterprise? Index and >>>>> search up to 200,000 lines of code with a free copy of Black Duck >>>>> Code Sight - the same software that powers the world's largest code >>>>> search on Ohloh, the Black Duck Open Hub! Try it now. >>>>> http://p.sf.net/sfu/bds >>>>> _______________________________________________ >>>>> Linux-f2fs-devel mailing list >>>>> Linux-f2fs-devel@lists.sourceforge.net >>>>> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel >>>> . >>>> >>> >>> >> >> -- >> Best regards, >> >> Andrey Tsyvarev >> Linux Verification Center, ISPRAS >> web:http://linuxtesting.org > > . > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gu Zheng Subject: Re: f2fs: Possible use-after-free when umount filesystem Date: Fri, 25 Jul 2014 13:49:07 +0800 Message-ID: <53D1EFD3.3070905@cn.fujitsu.com> References: <52F320FC.50803@ispras.ru> <534BC29B.3020408@ispras.ru> <53CCF1EC.30008@ispras.ru> <53CDC9AF.2050605@cn.fujitsu.com> <53CE3722.60307@ispras.ru> <000001cfa61b$c693b350$53bb19f0$@samsung.com> <53CF2E61.3000601@cn.fujitsu.com> <53D0DC8C.7050406@ispras.ru> <002a01cfa7b7$d79edc40$86dc94c0$@samsung.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from sog-mx-4.v43.ch3.sourceforge.com ([172.29.43.194] helo=mx.sourceforge.net) by sfs-ml-4.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1XAYZO-0001OG-Mw for linux-f2fs-devel@lists.sourceforge.net; Fri, 25 Jul 2014 06:01:30 +0000 Received: from [59.151.112.132] (helo=heian.cn.fujitsu.com) by sog-mx-4.v43.ch3.sourceforge.com with esmtp (Exim 4.76) id 1XAYZM-0004w2-Ri for linux-f2fs-devel@lists.sourceforge.net; Fri, 25 Jul 2014 06:01:30 +0000 In-Reply-To: <002a01cfa7b7$d79edc40$86dc94c0$@samsung.com> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net To: Chao Yu Cc: 'Jaegeuk Kim' , 'Andrey Tsyvarev' , 'linux-kernel' , 'Alexey Khoroshilov' , linux-f2fs-devel@lists.sourceforge.net T24gMDcvMjUvMjAxNCAxMToyMiBBTSwgQ2hhbyBZdSB3cm90ZToKCj4gSGksCj4gCj4gVG8gQW5k cmV5Ogo+IFRoYW5rcyBmb3IgeW91ciB0ZXN0IG9uIHRoaXMgcGF0Y2ghCj4gCj4gVG8gR3U6Cj4g SWYgeW91IGRvIG5vdCBvYmplY3QsIGxldCBtZSBtYWtlIGFuZCByZXNlbmQgYSBwYXRjaCBiYXNl IG9uIHRoZSBvbmUgd2hpY2gKPiBza2lwIGludmFsaWRhdGluZyBwYWdlcy4KClBsZWFzZSBnbyBh aGVhZC46KQoKVGhhbmtzLApHdQoKPiAKPiBSZWdhcmRzLAo+IFl1Cj4gCj4+IC0tLS0tT3JpZ2lu YWwgTWVzc2FnZS0tLS0tCj4+IEZyb206IEFuZHJleSBUc3l2YXJldiBbbWFpbHRvOnRzeXZhcmV2 QGlzcHJhcy5ydV0KPj4gU2VudDogVGh1cnNkYXksIEp1bHkgMjQsIDIwMTQgNjoxNSBQTQo+PiBU bzogR3UgWmhlbmc7IENoYW8gWXUKPj4gQ2M6ICdKYWVnZXVrIEtpbSc7ICdsaW51eC1rZXJuZWwn OyAnQWxleGV5IEtob3Jvc2hpbG92JzsKPj4gbGludXgtZjJmcy1kZXZlbEBsaXN0cy5zb3VyY2Vm b3JnZS5uZXQKPj4gU3ViamVjdDogUmU6IFtmMmZzLWRldl0gZjJmczogUG9zc2libGUgdXNlLWFm dGVyLWZyZWUgd2hlbiB1bW91bnQgZmlsZXN5c3RlbQo+Pgo+PiBIaSwKPj4KPj4gV2l0aCBwYXRj aCBza2lwcGluZyBpbnZhbGlkYXRpbmcgcGFnZXMgZm9yIG5vZGVfaW5vZGUgYW5kIG1ldGFfaW5v ZGUKPj4gdXNlLWFmdGVyLWZyZWUgZXJyb3IgZGlzYXBwZWFycyB0b28uCj4+Cj4+IDIzLjA3LjIw MTQgNzozOSwgR3UgWmhlbmcg0L/QuNGI0LXRgjoKPj4+IEhpLAo+Pj4gT24gMDcvMjMvMjAxNCAx MDoxMiBBTSwgQ2hhbyBZdSB3cm90ZToKPj4+Cj4+Pj4gSGkgQW5kcmV5IEd1LAo+Pj4+Cj4+Pj4+ IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tCj4+Pj4+IEZyb206IEFuZHJleSBUc3l2YXJldiBb bWFpbHRvOnRzeXZhcmV2QGlzcHJhcy5ydV0KPj4+Pj4gU2VudDogVHVlc2RheSwgSnVseSAyMiwg MjAxNCA2OjA0IFBNCj4+Pj4+IFRvOiBHdSBaaGVuZwo+Pj4+PiBDYzogSmFlZ2V1ayBLaW07IGxp bnV4LWtlcm5lbDsgQWxleGV5IEtob3Jvc2hpbG92OyBsaW51eC1mMmZzLWRldmVsQGxpc3RzLnNv dXJjZWZvcmdlLm5ldAo+Pj4+PiBTdWJqZWN0OiBSZTogW2YyZnMtZGV2XSBmMmZzOiBQb3NzaWJs ZSB1c2UtYWZ0ZXItZnJlZSB3aGVuIHVtb3VudCBmaWxlc3lzdGVtCj4+Pj4+Cj4+Pj4+IEhpIEd1 LAo+Pj4+Pgo+Pj4+Pj4+IEludmVzdGlnYXRpb24gc2hvd3MsIHRoYXQgZjJmc19ldmljdF9pbm9k ZSwgd2hlbiBjYWxsZWQgZm9yICdtZXRhX2lub2RlJywgdXNlcwo+Pj4+PiBpbnZhbGlkYXRlX21h cHBpbmdfcGFnZXMoKSBmb3IgJ25vZGVfaW5vZGUnLgo+Pj4+Pj4+IEJ1dCAnbm9kZV9pbm9kZScg aXMgZGVsZXRlZCBiZWZvcmUgJ21ldGFfaW5vZGUnIGluIGYyZnNfcHV0X3N1cGVyIHZpYSBpcHV0 KCkuCj4+Pj4+Pj4KPj4+Pj4+PiBJdCBzZWVtcyB0aGF0IGluIGNvbW1vbiB1c2FnZSBzY2VuYXJp byB0aGlzIHVzZS1hZnRlci1mcmVlIGlzIGJlbmlnbiwgYmVjYXVzZSAnbm9kZV9pbm9kZScKPj4+ Pj4gcmVtYWlucyBwYXJ0aWFsbHkgdmFsaWQgZGF0YSBldmVuIGFmdGVyIGttZW1fY2FjaGVfZnJl ZSgpLgo+Pj4+Pj4+IEJ1dCB0aGluZ3MgbWF5IGNoYW5nZSBpZiwgd2hpbGUgJ21ldGFfaW5vZGUn IGlzIGV2aWN0ZWQgaW4gb25lIGYyZnMgZmlsZXN5c3RlbSwgYW5vdGhlcgo+PiAobW91bnRlZCkK Pj4+Pj4gZjJmcyBmaWxlc3lzdGVtIHJlcXVlc3RzIGlub2RlIGZyb20gY2FjaGUsIGFuZCBmb3Jt ZWx5Cj4+Pj4+Pj4gJ25vZGVfaW5vZGUnIG9mIHRoZSBmaXJzdCBmaWxlc3lzdGVtIGlzIHJldHVy bmVkLgo+Pj4+Pj4gVGhlIGFuYWx5c2lzIHNlZW1zIHJlYXNvbmFibGUuIEhhdmUgeW91IHRyaWVk IHRvIHN3YXAgdGhlIHJlY2xhaW0gb3JkZXIgb2Ygbm9kZV9pbmRlCj4+Pj4+PiBhbmQgbWV0YV9p bm9kZT8KPj4+Pj4+Cj4+Pj4+PiBkaWZmIC0tZ2l0IGEvZnMvZjJmcy9zdXBlci5jIGIvZnMvZjJm cy9zdXBlci5jCj4+Pj4+PiBpbmRleCA4NzBmZTE5Li5lMTE0NDE4IDEwMDY0NAo+Pj4+Pj4gLS0t IGEvZnMvZjJmcy9zdXBlci5jCj4+Pj4+PiArKysgYi9mcy9mMmZzL3N1cGVyLmMKPj4+Pj4+IEBA IC00MzAsOCArNDMwLDggQEAgc3RhdGljIHZvaWQgZjJmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVy X2Jsb2NrICpzYikKPj4+Pj4+ICAgICAgICAgICBpZiAoc2JpLT5zX2RpcnR5ICYmIGdldF9wYWdl cyhzYmksIEYyRlNfRElSVFlfTk9ERVMpKQo+Pj4+Pj4gICAgICAgICAgICAgICAgICAgd3JpdGVf Y2hlY2twb2ludChzYmksIHRydWUpOwo+Pj4+Pj4KPj4+Pj4+IC0gICAgICAgaXB1dChzYmktPm5v ZGVfaW5vZGUpOwo+Pj4+Pj4gICAgICAgICAgIGlwdXQoc2JpLT5tZXRhX2lub2RlKTsKPj4+Pj4+ ICsgICAgICAgaXB1dChzYmktPm5vZGVfaW5vZGUpOwo+Pj4+Pj4KPj4+Pj4+ICAgICAgICAgICAv KiBkZXN0cm95IGYyZnMgaW50ZXJuYWwgbW9kdWxlcyAqLwo+Pj4+Pj4gICAgICAgICAgIGRlc3Ry b3lfbm9kZV9tYW5hZ2VyKHNiaSk7Cj4+Pj4+Pgo+Pj4+Pj4gVGhhbmtzLAo+Pj4+Pj4gR3UKPj4+ Pj4gV2l0aCByZWNsYWltIG9yZGVyIG9mIG5vZGVfaW5vZGUgYW5kIG1ldGFfaW5vZGUgc3dhcHBl ZCwgdXNlLWFmdGVyLWZyZWUKPj4+Pj4gZXJyb3IgZGlzYXBwZWFycy4KPj4+Pj4KPj4+Pj4gQnV0 IHNob3VsZG4ndCBpbml0aWFsaXphdGlvbiBvcmRlciBvZiB0aGVzZSBpbm9kZXMgYmUgc3dhcHBl ZCB0b28/Cj4+Pj4+IEFzIG1ldGFfaW5vZGUgdXNlcyBub2RlX2lub2RlLCBpdCBzZWVtcyBsb2dp Y2FsIHRoYXQgaXQgc2hvdWxkIGJlCj4+Pj4+IGluaXRpYWxpemVkIGFmdGVyIGl0Lgo+Pj4gVGhl IGluaXRpYWxpemF0aW9uIG9yZGVyIGRvc2Ugbm90IGFmZmVjdCBhbnl0aGluZywgc28gc3dhcHBp bmcgdGhlIG9yZGVyIGRvc2Ugbm90Cj4+PiBtYWtlIG1vcmUgc2Vuc2UgaGVyZS4KPj4+Cj4+Pj4g SU1PLCBpdCdzIG5vdCBlYXN5IHRvIGV4Y2hhbmdlIG9yZGVyIG9mIGluaXRpYWxpemF0aW9uIGJl dHdlZW4gbWV0YV9pbm9kZSBhbmQKPj4+PiBub2RlX2lub2RlLCBiZWNhdXNlIHdlIHNob3VsZCB1 c2UgbWV0YV9pbm9kZSBpbiBnZXRfdmFsaWRfY2hlY2twb2ludCBmb3IgdmFsaWQKPj4+PiBjcCBm aXJzdCBmb3IgdXN1YWwgdmVyaWZpY2F0aW9uLCB0aGVuIGluaXQgbm9kZV9pbm9kZS4KPj4+IFll YWgsIGJ1dCBJIHRoaW5rIGp1c3QgbW92aW5nIG5vZGVfaW5vZGUncyBpbml0aWFsaXphdGlvbiB0 byB0aGUgZnJvbnQgb2YgbWV0YV9pbm9kZQo+Pj4gZG9zZSBub3QgYnJlYWsgYW55dGhpbmcuCj4+ Pgo+Pj4+IEFzIEkgY2hlY2tlZCwgbmlkcyBmb3IgYm90aCBtZXRhX2lub2RlIGFuZCBub2RlX2lu b2RlIGFyZSByZXNlcnZhdGlvbiwgc28gaXQncyBub3QKPj4+PiBuZWNlc3NhcnkgZm9yIHVzIHRv IGludmFsaWRhdGUgcGFnZXMgd2hpY2ggd2lsbCBuZXZlciBhbGxvY2VkLgo+Pj4+Cj4+Pj4gSG93 IGFib3V0IHNraXBwaW5nIGl0IGFzIGZvbGxvd2luZz8KPj4+IEl0IHNlZW1zIHRoZSByaWdodCB3 YXkgdG8gZml4IHRoaXMgaXNzdWUuCj4+Pgo+Pj4gVG8gQW5kcmV5Ogo+Pj4gQ291bGQgeW91IHBs ZWFzZSB0cnkgdGhpcyBvbmU/Cj4+Pgo+Pj4gVGhhbmtzLAo+Pj4gR3UKPj4+Cj4+Pj4gZGlmZiAt LWdpdCBhL2ZzL2YyZnMvaW5vZGUuYyBiL2ZzL2YyZnMvaW5vZGUuYwo+Pj4+IGluZGV4IDJjZjY5 NjIuLmNhZmJhM2MgMTAwNjQ0Cj4+Pj4gLS0tIGEvZnMvZjJmcy9pbm9kZS5jCj4+Pj4gKysrIGIv ZnMvZjJmcy9pbm9kZS5jCj4+Pj4gQEAgLTI3Myw3ICsyNzMsNyBAQCB2b2lkIGYyZnNfZXZpY3Rf aW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKPj4+Pgo+Pj4+ICAgCWlmIChpbm9kZS0+aV9pbm8g PT0gRjJGU19OT0RFX0lOTyhzYmkpIHx8Cj4+Pj4gICAJCQlpbm9kZS0+aV9pbm8gPT0gRjJGU19N RVRBX0lOTyhzYmkpKQo+Pj4+IC0JCWdvdG8gbm9fZGVsZXRlOwo+Pj4+ICsJCWdvdG8gb3V0X2Ns ZWFyOwo+Pj4+Cj4+Pj4gICAJZjJmc19idWdfb24oZ2V0X2RpcnR5X2RlbnRzKGlub2RlKSk7Cj4+ Pj4gICAJcmVtb3ZlX2RpcnR5X2Rpcl9pbm9kZShpbm9kZSk7Cj4+Pj4gQEAgLTI5NSw2ICsyOTUs NyBAQCB2b2lkIGYyZnNfZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKPj4+Pgo+Pj4+ ICAgCXNiX2VuZF9pbnR3cml0ZShpbm9kZS0+aV9zYik7Cj4+Pj4gICBub19kZWxldGU6Cj4+Pj4g LQljbGVhcl9pbm9kZShpbm9kZSk7Cj4+Pj4gICAJaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKE5P REVfTUFQUElORyhzYmkpLCBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX2lubyk7Cj4+Pj4gK291dF9j bGVhcjoKPj4+PiArCWNsZWFyX2lub2RlKGlub2RlKTsKPj4+PiAgIH0KPj4+Pgo+Pj4+PiAtLQo+ Pj4+PiBCZXN0IHJlZ2FyZHMsCj4+Pj4+Cj4+Pj4+IEFuZHJleSBUc3l2YXJldgo+Pj4+PiBMaW51 eCBWZXJpZmljYXRpb24gQ2VudGVyLCBJU1BSQVMKPj4+Pj4gd2ViOmh0dHA6Ly9saW51eHRlc3Rp bmcub3JnCj4+Pj4+Cj4+Pj4+Cj4+Pj4+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+Pj4+PiBXYW50 IGZhc3QgYW5kIGVhc3kgYWNjZXNzIHRvIGFsbCB0aGUgY29kZSBpbiB5b3VyIGVudGVycHJpc2U/ IEluZGV4IGFuZAo+Pj4+PiBzZWFyY2ggdXAgdG8gMjAwLDAwMCBsaW5lcyBvZiBjb2RlIHdpdGgg YSBmcmVlIGNvcHkgb2YgQmxhY2sgRHVjawo+Pj4+PiBDb2RlIFNpZ2h0IC0gdGhlIHNhbWUgc29m dHdhcmUgdGhhdCBwb3dlcnMgdGhlIHdvcmxkJ3MgbGFyZ2VzdCBjb2RlCj4+Pj4+IHNlYXJjaCBv biBPaGxvaCwgdGhlIEJsYWNrIER1Y2sgT3BlbiBIdWIhIFRyeSBpdCBub3cuCj4+Pj4+IGh0dHA6 Ly9wLnNmLm5ldC9zZnUvYmRzCj4+Pj4+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCj4+Pj4+IExpbnV4LWYyZnMtZGV2ZWwgbWFpbGluZyBsaXN0Cj4+Pj4+ IExpbnV4LWYyZnMtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0Cj4+Pj4+IGh0dHBzOi8vbGlz dHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL2xpbnV4LWYyZnMtZGV2ZWwKPj4+PiAu Cj4+Pj4KPj4+Cj4+Pgo+Pgo+PiAtLQo+PiBCZXN0IHJlZ2FyZHMsCj4+Cj4+IEFuZHJleSBUc3l2 YXJldgo+PiBMaW51eCBWZXJpZmljYXRpb24gQ2VudGVyLCBJU1BSQVMKPj4gd2ViOmh0dHA6Ly9s aW51eHRlc3Rpbmcub3JnCj4gCj4gLgo+IAoKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KV2FudCBm YXN0IGFuZCBlYXN5IGFjY2VzcyB0byBhbGwgdGhlIGNvZGUgaW4geW91ciBlbnRlcnByaXNlPyBJ bmRleCBhbmQKc2VhcmNoIHVwIHRvIDIwMCwwMDAgbGluZXMgb2YgY29kZSB3aXRoIGEgZnJlZSBj b3B5IG9mIEJsYWNrIER1Y2sKQ29kZSBTaWdodCAtIHRoZSBzYW1lIHNvZnR3YXJlIHRoYXQgcG93 ZXJzIHRoZSB3b3JsZCdzIGxhcmdlc3QgY29kZQpzZWFyY2ggb24gT2hsb2gsIHRoZSBCbGFjayBE dWNrIE9wZW4gSHViISBUcnkgaXQgbm93LgpodHRwOi8vcC5zZi5uZXQvc2Z1L2JkcwpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1mMmZzLWRldmVs IG1haWxpbmcgbGlzdApMaW51eC1mMmZzLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldApodHRw czovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9saW51eC1mMmZzLWRldmVs Cg==