Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ozsuK-0002Vs-Kp for pgsql-hackers@arkaria.postgresql.org; Tue, 29 Nov 2022 05:11:49 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1ozsuJ-0005Yk-4V for pgsql-hackers@arkaria.postgresql.org; Tue, 29 Nov 2022 05:11:47 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ozsuI-0005Yb-Df for pgsql-hackers@lists.postgresql.org; Tue, 29 Nov 2022 05:11:46 +0000 Received: from esa7.fujitsucc.c3s2.iphmx.com ([68.232.159.87]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ozsuE-0007e8-H9 for pgsql-hackers@lists.postgresql.org; Tue, 29 Nov 2022 05:11:45 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=fujitsu.com; i=@fujitsu.com; q=dns/txt; s=fj1; t=1669698703; x=1701234703; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=Y7wymDexCH7q1ZSYPCWS0RNrnZlNlRw3E0slqxxg4e0=; b=C8Mc44aQPSdqzC2eC9g/yTdxmTSHIBtcNbi4vVN9kI8rEUVIqak/zwsO RfxBhebpvgFLWs31mfOO9AJyoLDxR0WYdBC3IqMxh7GURQvIVIZchrctP xjbeSc7U/U80qhxkFftxB5wx4gqMTlvGwlanArpmkjXfOV6nVI3ZOn1xV dOWuIvMXfHzrhJ+6Z/LT6JEudgUp7Wpbw7OuT03GYodapDSjehdlzIa/h 24On7AvU8e9KUXX/4hEdAK3My8Joz8p0yuK01m+dWotWvhesn10FhVzJL AcMeNbQwPj/9K1WfrLkIpQ4cHzL7oqbUKI2rKuGlHweQqjj5+XHv4Z5WP Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10545"; a="71227559" X-IronPort-AV: E=Sophos;i="5.96,202,1665414000"; d="scan'208";a="71227559" Received: from mail-os0jpn01lp2109.outbound.protection.outlook.com (HELO JPN01-OS0-obe.outbound.protection.outlook.com) ([104.47.23.109]) by ob1.fujitsucc.c3s2.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Nov 2022 14:11:39 +0900 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Y1/YazbK1tzB7Zi7+UAZit1lTeiDnZW+60CZhWygQW6MSIgsX8Zx4fCPYx3Xa9VACWQZuj6RVK9FU2A+7a92+l149sq41ABmmUynC9igpDzzd3afNTfPQ1D5VPpvIyzbhbopCsfPBeOoV2zfmz8FqURSmMXhVmJg37pbStL+2nfR0DiJgowJ/jGXIC8qlnXJ0RRzkFRkHIW4JmiTrX3ko5q1Q5FKuOraZJxSa4bqm0mKWOQoubf/RULfdOBda/iDx9S3GXIiZlAmYbBcEGLex/nxCUF/WTUNzvqvNG665VAnbXSd2UVfe2B1DZ3lGzwSJw0JfU6Cknu8LsrpGOjp+Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Y7wymDexCH7q1ZSYPCWS0RNrnZlNlRw3E0slqxxg4e0=; b=Wpk+hIHUnBBOO+T5zHqIpNpqZOGrpX0kX6EDC5CBD3f1KRLd/XInEk7DyjNjHZF7gZSmPbWS5/082rVsG8Cs68KcCtJiCpL3Dw7fhz+Ng0ySZ+e2oVkSZvcuTHNTpiGVNcrtkWbEQX5APhW8gDuEyGq2vuCE7UjizarkTSzeMHvNgSB0OusBFDPgy8BQtZs2u7Wq7vVUBoqPCAGPI5zRQwQ1Upr2e1Q95/scT6xF7gAoYlchj8Z9HCiBi7dCY6mieCzqOW0Sr3r1WhyMiL7ZjxxrOH+6ShdwBVsCHJgnvJ/brrrXahJVJK/T7U/eDPywT0tE4wnEW6tQHRULlkBgHA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=fujitsu.com; dmarc=pass action=none header.from=fujitsu.com; dkim=pass header.d=fujitsu.com; arc=none Received: from OS0PR01MB5716.jpnprd01.prod.outlook.com (2603:1096:604:bb::12) by TYWPR01MB10709.jpnprd01.prod.outlook.com (2603:1096:400:2a5::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5857.23; Tue, 29 Nov 2022 05:11:34 +0000 Received: from OS0PR01MB5716.jpnprd01.prod.outlook.com ([fe80::89a3:459e:492:7bcc]) by OS0PR01MB5716.jpnprd01.prod.outlook.com ([fe80::89a3:459e:492:7bcc%8]) with mapi id 15.20.5857.023; Tue, 29 Nov 2022 05:11:34 +0000 From: "houzj.fnst@fujitsu.com" To: Peter Smith CC: Amit Kapila , Masahiko Sawada , "wangw.fnst@fujitsu.com" , Dilip Kumar , "shiy.fnst@fujitsu.com" , PostgreSQL Hackers Subject: RE: Perform streaming logical transactions by background workers and parallel apply Thread-Topic: Perform streaming logical transactions by background workers and parallel apply Thread-Index: AQHYSXX5ZKpBKXxeUU2FhEhnmXQum6zlu9SQgAkSooCACBQ0gIABsTcwgAA1vECAAqHFgIAE/jVwgAXct9CAADkRgIALO/aAgAsRZICAB606AIAS+CyAgAAufICAAWQLgIABHxKAgAA3o4CAAeE3gIAJPr0AgAkxzACAAiJoAIAC0hUAgARvDICABQA2gIAAFvcAgAeBmICABO9ggIAJO+YAgABu1YCACQzpAIAJSy6AgAS+zICABq7mgIABSJUAgAAOtoCAACghoIAB8TqAgAqL+oCADJWRgIAGVm0AgAGAQICAAerMgIABYRWAgAgnZ+CAAXRdgIAGBUSQgAGFeoCAAFYagIABb5aggAGsWiCAATu3gIAEyyEAgABeLHCABFBngIAK5WIAgABrY4CABb89gIADiS0AgAEu2oCAAHBpgIADPWcAgAS/1gCADeB2AIAAPUnQgAEERACAABzggIAF+30AgAHyDYCAEzpGgIANkEmAgAI7xKCABhztAIAFv4zggABYqoCAABRMQIABvKAAgAS+5UCAAVlmEIACxK+AgAIepYCAAy1b4IABLamAgAB001CACRp9gIABWbSQ Date: Tue, 29 Nov 2022 05:11:34 +0000 Message-ID: References: In-Reply-To: Accept-Language: ja-JP, en-US Content-Language: ja-JP X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: =?utf-8?B?TVNJUF9MYWJlbF9hNzI5NWNjMS1kMjc5LTQyYWMtYWI0ZC0zYjBmNGZlY2Uw?= =?utf-8?B?NTBfQWN0aW9uSWQ9Y2IwMmFmYTMtOTJhYS00NjNkLWE4NmEtOGYwZWU1Y2E4?= =?utf-8?B?OTJmO01TSVBfTGFiZWxfYTcyOTVjYzEtZDI3OS00MmFjLWFiNGQtM2IwZjRm?= =?utf-8?B?ZWNlMDUwX0NvbnRlbnRCaXRzPTA7TVNJUF9MYWJlbF9hNzI5NWNjMS1kMjc5?= =?utf-8?B?LTQyYWMtYWI0ZC0zYjBmNGZlY2UwNTBfRW5hYmxlZD10cnVlO01TSVBfTGFi?= =?utf-8?B?ZWxfYTcyOTVjYzEtZDI3OS00MmFjLWFiNGQtM2IwZjRmZWNlMDUwX01ldGhv?= =?utf-8?B?ZD1TdGFuZGFyZDtNU0lQX0xhYmVsX2E3Mjk1Y2MxLWQyNzktNDJhYy1hYjRk?= =?utf-8?B?LTNiMGY0ZmVjZTA1MF9OYW1lPUZVSklUU1UtUkVTVFJJQ1RFRO+/ou++gA==?= =?utf-8?B?776LO01TSVBfTGFiZWxfYTcyOTVjYzEtZDI3OS00MmFjLWFiNGQtM2IwZjRm?= =?utf-8?B?ZWNlMDUwX1NldERhdGU9MjAyMi0xMS0yOVQwMzo1NjoyMFo7TVNJUF9MYWJl?= =?utf-8?B?bF9hNzI5NWNjMS1kMjc5LTQyYWMtYWI0ZC0zYjBmNGZlY2UwNTBfU2l0ZUlk?= =?utf-8?Q?=3Da19f121d-81e1-4858-a9d8-736e267fd4c7;?= authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=fujitsu.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: OS0PR01MB5716:EE_|TYWPR01MB10709:EE_ x-ms-office365-filtering-correlation-id: 728c83a7-3f38-4c58-f151-08dad1c82f81 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: EygwJLgOP6K7QqthiniJHdk7gLjnsWf6kV8GPbtDCos70LJMM7A1Y0Hj4cER3hSdgn2ERWZDIB7ZQe0bFK2m4YeE9/mAmBE4sohcRjaUBb2EBnWpCV5gO7rkv1ve3Rukmi6tKtZ1Tm4fsNQsMeRLdYbUUd21CxGVdBijVaQH3XxWmEEBIHCQ1xdlgQouvQ6wt1tI8uhCv4xiwwjKjmUKlEogRIX911NHMjuqZJ5dhGR2REEFWUxf7G7zy4f0SdFpFl7J3oW+cbgPw9u9dtvWSTVdt6i41zQkc+B2oKEPkifhaGRM8lxXnmILS/vp1ctiQFqNep0Y08TfG7fz9DoaUFrXqCnrmX/jVaWPkOTtfMbvwW7OPw19oDHv+UlgDJVkEwEnXEHIoOBhXD80SgpgVNvfik51Yf3Flc6j3TikrhgO9usPYMuqMh5cSfpASAo/eZSoGpSEmh0q1TJhSF9GK380oT3adAyUrQjsYb+wiLiPNwu2NDegA5aK3eJOzqNt3+MlRCttMBk5VXd2+OZbIaw5dMeGj28hTVvln7lmzzrVNkKd5fOzJKBcIC7E0md9eqEmdiyjuYOpxBUrkfCY+F0I8rTCAOilhKVgyo7V6Wkzc0CoJvhTMQJSRvr/kh9AzGi5EKVVFMC0YAubErm62lJmVyOo+4fmJXI6+5zcSXEPZZJUsWTLqIMMoTrtUgAdTjelO3pnppSlmFkHAZUVn205/alivYCUe37h85Sfdrw1ybGYDaSgV8e7muBHRflX x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:OS0PR01MB5716.jpnprd01.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230022)(4636009)(376002)(136003)(346002)(39860400002)(366004)(396003)(1590799012)(451199015)(5660300002)(316002)(54906003)(26005)(6916009)(53546011)(8676002)(86362001)(4326008)(76116006)(41300700001)(66446008)(64756008)(66946007)(66556008)(66476007)(9686003)(83380400001)(8936002)(7696005)(6506007)(186003)(85182001)(52536014)(2906002)(71200400001)(478600001)(33656002)(122000001)(55016003)(38100700002)(30864003)(82960400001)(38070700005)(1580799009)(21314003)(579004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?UW83MENNajYwbkE0OThXUGdQVmxIYWQ5VEFwU2Zta1JvSUxGb2NpRHJZS1Br?= =?utf-8?B?dm1qVEhMN0Z2YUtlSGZQSkhxckNKZ0pqUUVNS1dpQjFwYzlhVmU5bldEcjZI?= =?utf-8?B?bzcrNUxnejExQ2FjV1NXQXJSWUdab09FVXh3NlB0Q0Ywa3lWaWUxcjZ5bnNq?= =?utf-8?B?amdNOWh6QmtzeWQzREJTWDEvNWZwUTE5dmQxeXpIMlNhQVB3Q3dPNjhxUy9O?= =?utf-8?B?a3RTazdBQXYrQ0ZxaDkzRHJrZHJ3QzRJbC8yWEVrdk11dHpXRnpPanFYMksr?= =?utf-8?B?UjJEZUxNZCtwZ1RsM3ZKaGtmMTU1V1ZibCttZzdyUGlXSzdHR0YzbnV3cFdU?= =?utf-8?B?R1Jsa1YyTnI3VDBQbjJGUnkzVzdOR2RlbDI4QVc3VGZJZEJZUzRmSHdKZ1VY?= =?utf-8?B?c2JPUi9QOTF2aXI4R0o1Wkh5T3QrSjAwQkdJZnV0L3VONER5SWIvek9OSVB2?= =?utf-8?B?R25iSldtSXkxZ1BTUXFzaTBhVzA5TTY0R05WSUZaZURjcCtFT3NCQi9uM0xm?= =?utf-8?B?cHBvN3hMWDZYcm5IY3JlRHd0MDRNMjNiS1NUMkdZK0tkQjg2WldIWk9zQUtG?= =?utf-8?B?TU1tOVhuSWNjNXdTcU1PeVJJRVBoMVZRa2tuMXlpaFZRVGF2eFdVZjlwOGRi?= =?utf-8?B?d0VITWZwV3Jzbmo4TzZtK3Y5b3JoVGh4dHZWdTJTNzE5Zkc2bHJXbC80akNu?= =?utf-8?B?all4bFZxUDMxSDNZOFVRNGVIMHQrdGNVR1liM3c1NjVhVTM2NFRaRHZHRGsw?= =?utf-8?B?TDE4dUVaWEIwSVM0UCtocHV0alpPL1RHODMvdC8xTzZCQksrOS9mdkp3NSsw?= =?utf-8?B?aUh4ODJ5b2xKZVF5K3BDQzlWTzdRMEFRdVowcjFRVG5OMjUzZXBwMmhqeHN5?= =?utf-8?B?MTUyUVh0eUkrd1BsNTBNSVpGYkdEd2xLamo4UEcwNmpvTkdWNitXcE93b2pn?= =?utf-8?B?QThSYjJQeC8rcDFJZzkxLzY1NnhrRmpzM29QWTVsdi8vUkhEWjVNWnFLOEhM?= =?utf-8?B?MDdWOGk3L1lheWNtSnpnUXYxbjJWcnU1Yk1oZ2k5MlA0SjdRc1BrUFdnNVk3?= =?utf-8?B?MnIrd1F1UHk3M0xOWnYvWTJvZnN0UGFrMnkvbyt5NXNHOFowdksrZTl4d29l?= =?utf-8?B?NUFqcnEzSUljckswNFFFN3AxTVgrUWVmYko2QUpLOWpCK1hwbFoyNC9HUjdn?= =?utf-8?B?WjJmNHBlaVVxd3pZVmdBYkdPWEJ1bko1clFzRXAyTWk3R3RVMlhFVVhCR3Mr?= =?utf-8?B?eXlOZzF1NFVpeWh3SlVTVXdxd3VHL29XNGphZmlINzdJc25pWWdKZUR1UVp0?= =?utf-8?B?Um9YQkRLalcvY1g2Yk1kaDBqL2VKbFVTOW9QUi9mdklVd0FMNEZaeUZrZmpS?= =?utf-8?B?Ny9VN09TamQ4M24yUzlXc0pqdnU2TmpOaXdaYldOUGdlMHNZVGJkM1RvQUVZ?= =?utf-8?B?Z1V2NEFrQ25tZTVZWnZMekFPdUtPNVVieTU3UVpMcVlhM3pzVzVOMG1NNUxw?= =?utf-8?B?ZmlYQVQvZTNldHJFR1ZvN2FMbm8xUm9ydEdEL3lVbnF3clRiR081YTErbXov?= =?utf-8?B?RHUzeXM4NmRML25hTHNjSmVzeTc5L0lDbnRJM0lKOVpyc05LRkh2QlVwbHEr?= =?utf-8?B?ejd6cHZQZXlVM0hjU1dtd1lPRUZXQnhRbzNRU0xMbzhsalU3dm9HNG1nOC9m?= =?utf-8?B?bG5TQ2oyaGo3QkNmUnA0clJOeExYOHloYThjSkxnempoUDlLdWpRbWpnNDcr?= =?utf-8?B?OFdIRjFSTndXZ3VqZktxZWdhMUwrVDJWeHBPMmVrUStCd2MwTWhFSThFY0M5?= =?utf-8?B?WDJiU1pUNWFieTl4YXdCc1VnbWVTSkpkeHlUZ1lOUjlCc0MyZkE4b3lHTU5j?= =?utf-8?B?dmpoV1hvd1RObjVSSGp3S2tFdWZWdzNWTSthYndRSmh5MGc4OFBuWEdNZ09M?= =?utf-8?B?QWh4MHRhcURDdWg1YmJ0TWdvR3dEaWw4MmswazFxSGxFRTRZUEFZWXBzdU94?= =?utf-8?B?QTc0bnZxUE9zbUE4SWJ4dm05bGZ3a2hYYlRRd1JzWTFKeldnZDdMa3F6VkZC?= =?utf-8?B?cXVVVFFUdTdCOEZGRUJ3dHNTaVZoM0Z4aThGcWNZZFpHTUtSZEN3czdRenZG?= =?utf-8?Q?kWsaK9OXycXVypzlIHFuXONWN?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: ZGfFsuigKacIa6UILnAntIpMTN2ERqk78V9J41pwA2zLAu43ji7vbpdK3VnVeCKCbZLJ2/SWx1jmJa/ieQhq67DVwgJrCG3mldMURxi7OByPoPPoADL/c/IgtKCQ3zsXhrgbWi4eulbZpJR0HMp+THNGg1PuSg/OdmDtOdAgqrj0LVcSkTLrDY+QoXn9aaDuZj9RIuBx617u90s4PrD3z4X1gz2I+xWiGQ+J9vy83YtlCchyXR/tTZdrE/wREEqprgGdOKHfASxW4cWpD0y4h5tUTSFZAEryfpXF5A8B9Bn9haYrhEwjs9c+KDxF5OFzbzzWkDz0sQT3OIAYjHinV8J52ozgQbwCfR3aUTnRn+K0lVs6OcYGiipaE1znPfIVG/cVM9NbAeXX52pKarbL7C7Xx4XgrjE5pSl43DVo4vHfIo6L/O2VvsSNUgO7azRECmrSnEFaiKX0loHlAfsIH001p7yFX8VaaFWMEtMEZtnxiaJhih0xhdqjWrsJUorzr/QwT9fLf6pzKoGRfEz3Mfek4eC+9kKjijtZFtlwS4ursxQq10bfyIqJPS+L//zwyy5qIwygIj7ZGyuARF/LdPgNJnwaEVFVLnXR68BXU4Nb2bfw9viv/UrWquM0BmqrsW2eiZeFdxxhycyB66pLw74+Ktb4JGJ62DUjKqsWO3B5ofwgXCRoEarXp6zk2/1ugpZnpygLe5pqTQnwv5Vh3ZyFemg26uzFGGfuz96poNnwBzhHX+twXDkHykflk2YY0SpbpHB9rt4biREQjX3dXKDKlhV8W+Tx8S7Dh02J8hyY47j1v5GfJIpJstRIYFJqj5/rSnpvBt9Z+2h8TcuIgYTME+v2e3qLgGRniR0bDJXk4J5JbIR3n0UQRBxDqpz19oahag/kGfN1YImajprUmw== X-OriginatorOrg: fujitsu.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: OS0PR01MB5716.jpnprd01.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 728c83a7-3f38-4c58-f151-08dad1c82f81 X-MS-Exchange-CrossTenant-originalarrivaltime: 29 Nov 2022 05:11:34.6587 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a19f121d-81e1-4858-a9d8-736e267fd4c7 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: wAIBeyV5Smxsc1zrj1Uwndl3ILZaiYkdd2rz5iaFPKT9rDg0BquRLIsEFnBIWDIj493LpJtgka+OxOmsaf5JIw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYWPR01MB10709 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk T24gTW9uLCBOb3ZlbWJlciAyOCwgMjAyMiAxNToxOSBQTSBQZXRlciBTbWl0aCA8c21pdGhwYjIy NTBAZ21haWwuY29tPiB3cm90ZToNCj4gSGVyZSBhcmUgc29tZSByZXZpZXcgY29tbWVudHMgZm9y IHBhdGNoIHY1MS0wMDAyDQoNClRoYW5rcyBmb3IgeW91ciBjb21tZW50cyENCg0KPiA9PT09PT0N Cj4gDQo+IDEuDQo+IA0KPiBHRU5FUkFMIC0gdGVybWlub2xvZ3k6ICBzcG9vbC9zZXJpYWxpemUg YW5kIGRhdGEvY2hhbmdlcy9tZXNzYWdlDQo+IA0KPiBUaGUgdGVybWlub2xvZ3kgc2VlbXMgdG8g YmUgdXNlZCBhdCByYW5kb20uIElNTyBpdCBtaWdodCBiZSB3b3J0aHdoaWxlIA0KPiByZWNoZWNr aW5nIGF0IGxlYXN0IHRoYXQgdGVybXMgYXJlIHVzZWQgY29uc2lzdGVudGx5IGluIGFsbCB0aGUg DQo+IGNvbW1lbnRzLiBlLmcgInNlcmlhbGl6ZSBtZXNzYWdlIGRhdGEgdG8gZGlzayIgLi4uIGFu ZCBsYXRlciAuLi4NCj4gImFwcGx5IHRoZSBzcG9vbGVkIG1lc3NhZ2VzIi4NCj4gDQo+IEFsc28g Zm9yIHBsYWNlcyB3aGVyZSBpdCBzYXlzICJXcml0ZSB0aGUgbWVzc2FnZSB0byBmaWxlIiBtYXli ZSANCj4gY29uc2lkZXIgdXNpbmcgY29uc2lzdGVudCB0ZXJtaW5vbG9neSBsaWtlICJzZXJpYWxp emUgdGhlIG1lc3NhZ2UgdG8gYSANCj4gZmlsZSIuDQo+IA0KPiBBbHNvLCB0cnkgdG8gc3RhbmRh cmRpemUgdGhlIHdheSB0aGluZ3MgYXJlIGRlc2NyaWJlZCBieSB1c2luZyANCj4gY29uc2lzdGVu dCAoaWYgdGhleSByZWFsbHkgYXJlIHRoZSBzYW1lKSB0ZXJtaW5vbG9neSBmb3IgIndyaXRpbmcg DQo+IGRhdGEiIFZTICJ3cml0aW5nIGRhdGEiIFZTICJ3cml0aW5nIG1lc3NhZ2VzIiBldGMuIEl0 IGlzIGNvbmZ1c2luZyANCj4gdHJ5aW5nIHRvIGtub3cgaWYgdGhlIGRpZmZlcmVudCB3b3JkaW5n IGhhcyBzb21lIGludGVuZGVkIG1lYW5pbmcgb3IgDQo+IGlzIGl0IGp1c3QgcmFuZG9tLg0KDQpJ IGNoYW5nZXMgc29tZSBvZiB0aGVtLCBidXQgSSB0aGluayB0aGVyZSBzb21lIHRoaW5ncyBsZWZ0 IHdoaWNoIEkgd2lsbCByZWNoZWNrIGluIG5leHQgdmVyc2lvbi4NCkFuZCBJIHRoaW5rIHdlJ2Qg YmV0dGVyIG5vdCBjaGFuZ2UgY29tbWVudHMgdGhhdCByZWZlciB0byBleGlzdGluZyBjb21tZW50 cyBvciBmdW5jdGlvbnMgb3IgdmFyaWFibGVzLg0KRm9yIGV4YW1wbGUsIGl04oCZcyBmaW5lIGZv ciBjb21tZW50cyB0aGF0IHJlZmVyIHRvIGFwcGx5X3Nwb29sZWRfbWVzc2FnZSB0byB1c2UgInNw b29sIiAibWVzc2FnZSIuDQoNCg0KPiA9PT09PT0NCj4gDQo+IENvbW1pdCBtZXNzYWdlDQo+IA0K PiAyLg0KPiBXaGVuIHRoZSBsZWFkZXIgYXBwbHkgd29ya2VyIHRpbWVzIG91dCB3aGlsZSBzZW5k aW5nIGEgbWVzc2FnZSB0byB0aGUgDQo+IHBhcmFsbGVsIGFwcGx5IHdvcmtlci4gSW5zdGVhZCBv ZiBlcnJvcmluZyBvdXQsIHN3aXRjaCB0byBwYXJ0aWFsIA0KPiBzZXJpYWxpemUgbW9kZSBhbmQg bGV0IHRoZSBsZWFkZXIgc2VyaWFsaXplIGFsbCByZW1haW5pbmcgY2hhbmdlcyB0byANCj4gdGhl IGZpbGUgYW5kIG5vdGlmeSB0aGUgcGFyYWxsZWwgYXBwbHkgd29ya2VycyB0byByZWFkIGFuZCBh cHBseSB0aGVtIGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uLg0KPiANCj4gfg0KPiANCj4g VGhlIGZpcnN0IHNlbnRlbmNlIHNlZW1zIGluY29tcGxldGUNCj4gDQo+IFNVR0dFU1RJT04uDQo+ IEluIHBhdGNoIDAwMDEgaWYgdGhlIGxlYWRlciBhcHBseSB3b3JrZXIgdGltZXMgb3V0IHdoaWxl IGF0dGVtcHRpbmcgdG8gDQo+IHNlbmQgYSBtZXNzYWdlIHRvIHRoZSBwYXJhbGxlbCBhcHBseSB3 b3JrZXIgaXQgcmVzdWx0cyBpbiBhbiBFUlJPUi4NCj4gDQo+IFRoaXMgcGF0Y2ggKDAwMDIpIG1v ZGlmaWVzIHRoYXQgYmVoYXZpb3VyLCBzbyBpbnN0ZWFkIG9mIGVycm9yaW5nIGl0IA0KPiB3aWxs IHN3aXRjaCB0byAicGFydGlhbCBzZXJpYWxpemUiIG1vZGUgLSAgaW4gdGhpcyBtb2RlIHRoZSBs ZWFkZXIgDQo+IHNlcmlhbGl6ZXMgYWxsIHJlbWFpbmluZyBjaGFuZ2VzIHRvIGEgZmlsZSBhbmQg bm90aWZpZXMgdGhlIHBhcmFsbGVsIA0KPiBhcHBseSB3b3JrZXJzIHRvIHJlYWQgYW5kIGFwcGx5 IHRoZW0gYXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24uDQo+IA0KPiB+fn4NCj4gDQo+IDMu DQo+IA0KPiBUaGlzIHBhdGNoIDAwMDIgaXMgY2FsbGVkIOKAnFNlcmlhbGl6ZSBwYXJ0aWFsIGNo YW5nZXMgdG8gZGlzayBpZiB0aGUgDQo+IHNobV9tcSBidWZmZXIgaXMgZnVsbOKAnSwgYnV0IHRo ZSBjb21taXQgbWVzc2FnZSBpcyBzYXlpbmcgbm90aGluZyBhYm91dCANCj4gdGhlIGJ1ZmZlciBm aWxsaW5nIHVwLiBJIHRoaW5rIHRoZSBDb21taXQgbWVzc2FnZSBzaG91bGQgYmUgbWVudGlvbmlu ZyANCj4gc29tZXRoaW5nIHRoYXQgbWFrZXMgdGhlIGNvbW1pdCBwYXRjaCBuYW1lIG1vcmUgcmVs ZXZhbnQuIE90aGVyd2lzZSANCj4gY2hhbmdlIHRoZSBwYXRjaCBuYW1lLg0KDQpDaGFuZ2VkLg0K DQo+ID09PT09PQ0KPiANCj4gLi4uL3JlcGxpY2F0aW9uL2xvZ2ljYWwvYXBwbHlwYXJhbGxlbHdv cmtlci5jDQo+IA0KPiA0LiBGaWxlIGhlYWRlciBjb21tZW50DQo+IA0KPiArICogdGltZW91dCBp cyBleGNlZWRlZCwgdGhlIExBIHdpbGwgd3JpdGUgdG8gZmlsZSBhbmQgaW5kaWNhdGUgUEEtMiAN Cj4gKyB0aGF0IGl0DQo+ICsgKiBuZWVkcyB0byByZWFkIGZpbGUgZm9yIHJlbWFpbmluZyBtZXNz YWdlcy4gVGhlbiBMQSB3aWxsIHN0YXJ0IA0KPiArIHdhaXRpbmcgZm9yDQo+ICsgKiBjb21taXQg d2hpY2ggd2lsbCBkZXRlY3QgZGVhZGxvY2sgaWYgYW55LiAoU2VlIHBhX3NlbmRfZGF0YSgpIGFu ZCANCj4gKyB0eXBlZGVmDQo+ICsgKiBlbnVtIFRyYW5zQXBwbHlBY3Rpb24pDQo+IA0KPiAibmVl ZHMgdG8gcmVhZCBmaWxlIGZvciByZW1haW5pbmcgbWVzc2FnZXMiIC0+ICJuZWVkcyB0byByZWFk IHRoYXQgDQo+IGZpbGUgZm9yIHRoZSByZW1haW5pbmcgbWVzc2FnZXMiDQoNCkNoYW5nZWQuDQoN Cj4gfn5+DQo+IA0KPiA1LiBwYV9mcmVlX3dvcmtlcg0KPiANCj4gKyAvKg0KPiArICogU3RvcCB0 aGUgd29ya2VyIGlmIHRoZXJlIGFyZSBlbm91Z2ggd29ya2VycyBpbiB0aGUgcG9vbC4NCj4gKyAq DQo+ICsgKiBYWFggd2UgYWxzbyBuZWVkIHRvIHN0b3AgdGhlIHdvcmtlciBpZiB0aGUgbGVhZGVy IGFwcGx5IHdvcmtlcg0KPiArICogc2VyaWFsaXplZCBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbiBk YXRhIHRvIGEgZmlsZSBkdWUgdG8gc2VuZCB0aW1lb3V0Lg0KPiArICogVGhpcyBpcyBiZWNhdXNl IHRoZSBtZXNzYWdlIGNvdWxkIGJlIHBhcnRpYWxseSB3cml0dGVuIHRvIHRoZSANCj4gKyBxdWV1 ZSBkdWUNCj4gKyAqIHRvIHNlbmQgdGltZW91dCBhbmQgdGhlcmUgaXMgbm8gd2F5IHRvIGNsZWFu IHRoZSBxdWV1ZSBvdGhlciB0aGFuDQo+ICsgKiByZXNlbmRpbmcgdGhlIG1lc3NhZ2UgdW50aWwg aXQgc3VjY2VlZHMuIFRvIGF2b2lkIGNvbXBsZXhpdHksIHdlDQo+ICsgKiBkaXJlY3RseSBzdG9w IHRoZSB3b3JrZXIgaW4gdGhpcyBjYXNlLg0KPiArICovDQo+ICsgaWYgKHdpbmZvLT5zZXJpYWxp emVfY2hhbmdlcyB8fA0KPiArIG5hcHBseXdvcmtlcnMgPiAobWF4X3BhcmFsbGVsX2FwcGx5X3dv cmtlcnNfcGVyX3N1YnNjcmlwdGlvbiAvIDIpKQ0KPiANCj4gNWEuDQo+IA0KPiArICogWFhYIHdl IGFsc28gbmVlZCB0byBzdG9wIHRoZSB3b3JrZXIgaWYgdGhlIGxlYWRlciBhcHBseSB3b3JrZXIN Cj4gKyAqIHNlcmlhbGl6ZWQgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24gZGF0YSB0byBhIGZpbGUg ZHVlIHRvIHNlbmQgdGltZW91dC4NCj4gDQo+IFNVR0dFU1RJT04NCj4gWFhYIFRoZSB3b3JrZXIg aXMgYWxzbyBzdG9wcGVkIGlmIHRoZSBsZWFkZXIgYXBwbHkgd29ya2VyIG5lZWRlZCB0byANCj4g c2VyaWFsaXplIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uIGRhdGEgZHVlIHRvIGEgc2VuZCB0aW1l b3V0Lg0KPiANCj4gfg0KPiANCj4gNWIuDQo+IA0KPiArIC8qIFVubGluayB0aGUgZmlsZXMgd2l0 aCBzZXJpYWxpemVkIGNoYW5nZXMuICovIGlmDQo+ICsgKHdpbmZvLT5zZXJpYWxpemVfY2hhbmdl cykNCj4gKyBzdHJlYW1fY2xlYW51cF9maWxlcyhNeUxvZ2ljYWxSZXBXb3JrZXItPnN1YmlkLCB3 aW5mby0+c2hhcmVkLT54aWQpOw0KPiANCj4gQSBiZXR0ZXIgY29tbWVudCBtaWdodCBiZQ0KPiAN Cj4gU1VHR0VTVElPTg0KPiBVbmxpbmsgYW55IGZpbGVzIHRoYXQgd2VyZSBuZWVkZWQgdG8gc2Vy aWFsaXplIHBhcnRpYWwgY2hhbmdlcy4NCg0KQ2hhbmdlZC4NCg0KPiB+fn4NCj4gDQo+IDYuIHBh X3Nwb29sZWRfbWVzc2FnZXMNCj4gDQo+IC8qDQo+ICAqIFJlcGxheSB0aGUgc3Bvb2xlZCBtZXNz YWdlcyBpbiB0aGUgcGFyYWxsZWwgYXBwbHkgd29ya2VyIGlmIGxlYWRlciANCj4gYXBwbHkNCj4g ICogd29ya2VyIGhhcyBmaW5pc2hlZCBzZXJpYWxpemluZyBjaGFuZ2VzIHRvIHRoZSBmaWxlLg0K PiAgKi8NCj4gc3RhdGljIHZvaWQNCj4gcGFfc3Bvb2xlZF9tZXNzYWdlcyh2b2lkKQ0KPiANCj4g NmEuDQo+IElNTyBhIGJldHRlciBuYW1lIGZvciB0aGlzIGZ1bmN0aW9uIHdvdWxkIGJlIA0KPiBw YV9hcHBseV9zcG9vbGVkX21lc3NhZ2VzKCk7DQoNCk5vdCBzdXJlIGFib3V0IHRoaXMuDQoNCj4g fg0KPiANCj4gNmIuDQo+ICJpZiBsZWFkZXIgYXBwbHkiIC0+ICJpZiB0aGUgbGVhZGVyIGFwcGx5 Ig0KDQpDaGFuZ2VkLg0KDQo+IH4NCj4gDQo+IDcuDQo+IA0KPiArIC8qDQo+ICsgKiBBY3F1aXJl IHRoZSBzdHJlYW0gbG9jayBpZiB0aGUgbGVhZGVyIGFwcGx5IHdvcmtlciBpcyBzZXJpYWxpemlu Zw0KPiArICogY2hhbmdlcyB0byB0aGUgZmlsZSwgYmVjYXVzZSB0aGUgcGFyYWxsZWwgYXBwbHkg d29ya2VyIHdpbGwgbm8gDQo+ICsgbG9uZ2VyDQo+ICsgKiBoYXZlIGEgY2hhbmNlIHRvIHJlY2Vp dmUgYSBTVFJFQU1fU1RPUCBhbmQgYWNxdWlyZSB0aGUgbG9jayB1bnRpbCANCj4gKyB0aGUNCj4g KyAqIGxlYWRlciBzZXJpYWxpemUgYWxsIGNoYW5nZXMgdG8gdGhlIGZpbGUuDQo+ICsgKi8NCj4g KyBpZiAoZmlsZXNldF9zdGF0ZSA9PSBMRUFERVJfRklMRVNFVF9CVVNZKSB7IA0KPiArIHBhX2xv Y2tfc3RyZWFtKE15UGFyYWxsZWxTaGFyZWQtPnhpZCwgQWNjZXNzU2hhcmVMb2NrKTsgDQo+ICsg cGFfdW5sb2NrX3N0cmVhbShNeVBhcmFsbGVsU2hhcmVkLT54aWQsIEFjY2Vzc1NoYXJlTG9jayk7 IH0NCj4gDQo+IFNVR0dFU1RJT04gKHJlYXJyYW5nZWQgY29tbWVudCAtIHBsZWFzZSBjaGVjaywg SSBhbSBub3Qgc3VyZSBpZiBJIGdvdCANCj4gdGhpcyByaWdodCkNCj4gDQo+IElmIHRoZSBsZWFk ZXIgYXBwbHkgd29ya2VyIGlzIHN0aWxsIChidXN5KSBzZXJpYWxpemluZyBwYXJ0aWFsIGNoYW5n ZXMgDQo+IHRoZW4gdGhlIHBhcmFsbGVsIGFwcGx5IHdvcmtlciBhY3F1aXJlcyB0aGUgc3RyZWFt IGxvY2sgbm93Lg0KPiBPdGhlcndpc2UsIGl0IHdvdWxkIG5vdCBoYXZlIGEgY2hhbmNlIHRvIHJl Y2VpdmUgYSBTVFJFQU1fU1RPUCAoYW5kIA0KPiBhY3F1aXJlIHRoZSBzdHJlYW0gbG9jaykgdW50 aWwgdGhlIGxlYWRlciBoYWQgc2VyaWFsaXplZCBhbGwgY2hhbmdlcy4NCg0KQ2hhbmdlZC4NCg0K PiB+fn4NCj4gDQo+IDguIHBhX3NlbmRfZGF0YQ0KPiANCj4gKyAqDQo+ICsgKiBXaGVuIHNlbmRp bmcgZGF0YSB0aW1lcyBvdXQsIGRhdGEgd2lsbCBiZSBzZXJpYWxpemVkIHRvIGRpc2suIEFuZCAN Cj4gKyB0aGUNCj4gKyAqIGN1cnJlbnQgc3RyZWFtaW5nIHRyYW5zYWN0aW9uIHdpbGwgZW50ZXIg UEFSVElBTF9TRVJJQUxJWkUgbW9kZSwgDQo+ICsgd2hpY2gNCj4gbWVhbnMNCj4gKyAqIHRoYXQg c3Vic2VxdWVudCBkYXRhIHdpbGwgYWxzbyBiZSBzZXJpYWxpemVkIHRvIGRpc2suDQo+ICAgKi8N Cj4gIHZvaWQNCj4gIHBhX3NlbmRfZGF0YShQYXJhbGxlbEFwcGx5V29ya2VySW5mbyAqd2luZm8s IFNpemUgbmJ5dGVzLCBjb25zdCB2b2lkDQo+ICpkYXRhKQ0KPiANCj4gU1VHR0VTVElPTiAobWlu b3IgY29tbWVudCBjaGFuZ2UpDQo+IA0KPiBJZiB0aGUgYXR0ZW1wdCB0byBzZW5kIGRhdGEgdmlh IHNoYXJlZCBtZW1vcnkgdGltZXMgb3V0LCB0aGVuIHdlIHdpbGwgDQo+IHN3aXRjaCB0byAiUEFS VElBTF9TRVJJQUxJWkUgbW9kZSIgZm9yIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiBUaGlzIA0K PiBtZWFucyB0aGF0IHRoZSBjdXJyZW50IGRhdGEgYW5kIGFueSBzdWJzZXF1ZW50IGRhdGEgZm9y IHRoaXMgDQo+IHRyYW5zYWN0aW9uIHdpbGwgYmUgc2VyaWFsaXplZCB0byBkaXNrLg0KDQpDaGFu Z2VkLg0KDQo+IH4NCj4gDQo+IDkuDQo+IA0KPiAgIEFzc2VydCghSXNUcmFuc2FjdGlvblN0YXRl KCkpOw0KPiArIEFzc2VydCghd2luZm8tPnNlcmlhbGl6ZV9jaGFuZ2VzKTsNCj4gDQo+IEhvdyBh Ym91dCBhbHNvIGFzc2VydGluZyB0aGF0IHRoaXMgbXVzdCBiZSB0aGUgTEEgd29ya2VyPw0KDQpO b3Qgc3VyZSBhYm91dCB0aGlzIGFzIEkgdGhpbmsgdGhlIHBhcmFsbGVsIGFwcGx5IHdvcmtlciB3 b24ndCBoYXZlIGEgd2luZm8uDQoNCj4gfg0KPiANCj4gMTAuDQo+IA0KPiArIC8qDQo+ICsgKiBU aGUgcGFyYWxsZWwgYXBwbHkgd29ya2VyIG1pZ2h0IGJlIHN0dWNrIGZvciBzb21lIHJlYXNvbiwg c28NCj4gKyAqIHN0b3Agc2VuZGluZyBkYXRhIHRvIHBhcmFsbGVsIHdvcmtlciBhbmQgc3RhcnQg dG8gc2VyaWFsaXplDQo+ICsgKiBkYXRhIHRvIGZpbGVzLg0KPiArICovDQo+ICsgd2luZm8tPnNl cmlhbGl6ZV9jaGFuZ2VzID0gdHJ1ZTsNCj4gDQo+IFNVR0dFU1RJT04gKG1pbm9yIHJld29yZCkN Cj4gVGhlIHBhcmFsbGVsIGFwcGx5IHdvcmtlciBtaWdodCBiZSBzdHVjayBmb3Igc29tZSByZWFz b24sIHNvIHN0b3AgDQo+IHNlbmRpbmcgZGF0YSBkaXJlY3RseSB0byBpdCBhbmQgc3RhcnQgdG8g c2VyaWFsaXplIGRhdGEgdG8gZmlsZXMgDQo+IGluc3RlYWQuDQoNCkNoYW5nZWQuDQoNCj4gfg0K PiANCj4gMTEuDQo+ICsgLyogU2tpcCBmaXJzdCBieXRlIGFuZCBzdGF0aXN0aWNzIGZpZWxkcy4g Ki8gbXNnLmN1cnNvciArPSANCj4gKyBTSVpFX1NUQVRTX01FU1NBR0UgKyAxOw0KPiANCj4gSU1P IGl0IHdvdWxkIGJlIGJldHRlciBmb3IgdGhlIGNvbW1lbnQgb3JkZXIgYW5kIHRoZSBjb2RlIGNh bGN1bGF0aW9uIA0KPiBvcmRlciB0byBiZSB0aGUgc2FtZS4NCj4gDQo+IFNVR0dFU1RJT04NCj4g LyogU2tpcCBmaXJzdCBieXRlIGFuZCBzdGF0aXN0aWNzIGZpZWxkcy4gKi8gbXNnLmN1cnNvciAr PSAxICsgDQo+IFNJWkVfU1RBVFNfTUVTU0FHRTsNCg0KQ2hhbmdlZC4NCg0KPiB+DQo+IA0KPiAx Mi4gcGFfc3RyZWFtX2Fib3J0DQo+IA0KPiArIC8qDQo+ICsgKiBJZiB0aGUgcGFyYWxsZWwgYXBw bHkgd29ya2VyIGlzIGFwcGx5aW5nIHRoZSBzcG9vbGVkDQo+ICsgKiBtZXNzYWdlcywgd2Ugc2F2 ZSB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uIGFuZCBjbG9zZSB0aGUNCj4gKyAqIGZpbGUgdG8g cHJldmVudCB0aGUgZmlsZSBmcm9tIGJlaW5nIGFjY2lkZW50YWxseSBjbG9zZWQgb24NCj4gKyAq IHJvbGxiYWNrLg0KPiArICovDQo+ICsgaWYgKHN0cmVhbV9mZCkNCj4gKyB7DQo+ICsgQnVmRmls ZVRlbGwoc3RyZWFtX2ZkLCAmZmlsZW5vLCAmb2Zmc2V0KTsgQnVmRmlsZUNsb3NlKHN0cmVhbV9m ZCk7IA0KPiArIHJlb3Blbl9zdHJlYW1fZmQgPSB0cnVlOyB9DQo+ICsNCj4gICBSb2xsYmFja1Rv U2F2ZXBvaW50KHNwbmFtZSk7DQo+ICAgQ29tbWl0VHJhbnNhY3Rpb25Db21tYW5kKCk7DQo+ICAg c3VieGFjdGxpc3QgPSBsaXN0X3RydW5jYXRlKHN1YnhhY3RsaXN0LCBpICsgMSk7DQo+ICsNCj4g KyAvKg0KPiArICogUmVvcGVuIHRoZSBmaWxlIGFuZCBzZXQgdGhlIGZpbGUgcG9zaXRpb24gdG8g dGhlIHNhdmVkDQo+ICsgKiBwb3NpdGlvbi4NCj4gKyAqLw0KPiArIGlmIChyZW9wZW5fc3RyZWFt X2ZkKQ0KPiANCj4gSXQgc2VlbXMgYSBiaXQgdmFndWUgdG8ganVzdCByZWZlciB0byAiY2xvc2Ug dGhlIGZpbGUiIGFuZCAicmVvcGVuIHRoZSANCj4gZmlsZSIgaW4gdGhlc2UgY29tbWVudHMuIElN TyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gY2FsbCB0aGlzIGZpbGUgYnkgYSANCj4gbmFtZSBsaWtl ICJ0aGUgbWVzc2FnZSBzcG9vbCBmaWxlIiBvciBzaW1pbGFyLiBQbGVhc2UgY2hlY2sgYWxsIG90 aGVyIA0KPiBzaW1pbGFyIGNvbW1lbnRzLg0KDQpDaGFuZ2VkLg0KDQo+IH5+fg0KPiANCj4gMTMu IHBhX3NldF9maWxlc2V0X3N0YXRlDQo+IA0KPiAgLyoNCj4gKyAqIFNldCB0aGUgZmlsZXNldF9z dGF0ZSBmbGFnIGZvciB0aGUgZ2l2ZW4gcGFyYWxsZWwgYXBwbHkgd29ya2VyLiANCj4gK1RoZQ0K PiArICogc3RyZWFtX2ZpbGVzZXQgb2YgdGhlIGxlYWRlciBhcHBseSB3b3JrZXIgd2lsbCBiZSB3 cml0dGVuIGludG8gdGhlIA0KPiArc2hhcmVkDQo+ICsgKiBtZW1vcnkgaWYgdGhlIGZpbGVzZXRf c3RhdGUgaXMgTEVBREVSX0ZJTEVTRVRfQUNDRVNTSUJMRS4NCj4gKyAqLw0KPiArdm9pZA0KPiAr cGFfc2V0X2ZpbGVzZXRfc3RhdGUoUGFyYWxsZWxBcHBseVdvcmtlclNoYXJlZCAqd3NoYXJlZCwg DQo+ICtMZWFkZXJGaWxlU2V0U3RhdGUgZmlsZXNldF9zdGF0ZSkgew0KPiANCj4gMTNhLg0KPiAN Cj4gSXQgaXMgYW4gZW51bSAtLSBub3QgYSAiZmxhZyIsIHNvOg0KPiANCj4gImZpbGVzZXRfc3Rh dGUgZmxhZyIgLT4gImZpbGVzdGUgc3RhdGUiDQoNCkNoYW5nZWQuDQoNCj4gfn4NCj4gDQo+IDEz Yi4NCj4gDQo+IEl0IHNlZW1lZCBzdHJhbmdlIHRvIG1lIHRoYXQgdGhlIGNvbW1lbnQvY29kZSBz YXlzIHRoaXMgc3RhdGUgaXMgb25seSANCj4gd3JpdHRlbiB0byBzaG0gd2hlbiBpdCBpcyAiQUND RVNTSUJMRSIuLi4uIElJVUMgdGhpcyBzYW1lIGZpbGVzdGF0ZSANCj4gbGluZ2VycyBhcm91bmQg dG8gYmUgcmV1c2VkIGZvciBvdGhlciB3b3JrZXJzIHNvIEkgZXhwZWN0ZWQgdGhlIHN0YXRlIA0K PiBzaG91bGQgKmFsd2F5cyogYmUgd3JpdHRlbiB3aGVuZXZlciB0aGUgTEEgY2hhbmdlcyBpdC4g KEkgbWVhbiBldmVuIGlmIA0KPiB0aGUgUEEgaXMgbm90IG5lZWRpbmcgdG8gbG9vayBhdCB0aGlz IG1lbWJlciwgSSBzdGlsbCB0aGluayBpdCBzaG91bGQgDQo+IGhhdmUgdGhlIGN1cnJlbnQvY29y cmVjdCB2YWx1ZSBpbiBpdCkuDQoNCkkgdGhpbmsgd2Ugd2lsbCBhbHdheXMgY2hhbmdlIHRoZSBz dGF0ZS4NCk9yIGRvIHlvdSBtZWFuIHRoZSBmaWxlc2V0IGlzIG9ubHkgd3JpdHRlbihub3QgdGhl IHN0YXRlKSB3aGVuIGl0IGlzIEFDQ0VTU0lCTEU/DQpUaGUgZmlsZXNldCBjYW5ub3QgYmUgdXNl ZCBiZWZvcmUgaXQncyBSRUFEWSwgc28gSSBkaWRuJ3Qgd3JpdGUgdGhhdCBmaWxlc2V0IGludG8N CnNoYXJlZCBtZW1vcnkgYmVmb3JlIHRoYXQuDQoNCj4gPT09PT09DQo+IA0KPiBzcmMvYmFja2Vu ZC9yZXBsaWNhdGlvbi9sb2dpY2FsL3dvcmtlci5jDQo+IA0KPiAxNC4gVFJBTlNfTEVBREVSX1NF TkRfVE9fUEFSQUxMRUwNCj4gDQo+ICsgKiBUUkFOU19MRUFERVJfUEFSVElBTF9TRVJJQUxJWkU6 DQo+ICsgKiBUaGUgYWN0aW9uIG1lYW5zIHRoYXQgd2UgYXJlIGluIHRoZSBsZWFkZXIgYXBwbHkg d29ya2VyIGFuZCBoYXZlIA0KPiArIHNlbnQNCj4gc29tZQ0KPiArICogY2hhbmdlcyB0byB0aGUg cGFyYWxsZWwgYXBwbHkgd29ya2VyLCBidXQgdGhlIHJlbWFpbmluZyBjaGFuZ2VzIA0KPiArIG5l ZWQgdG8gYmUNCj4gKyAqIHNlcmlhbGl6ZWQgdG8gZGlzayBkdWUgdG8gdGltZW91dCB3aGlsZSBz ZW5kaW5nIGRhdGEsIGFuZCB0aGUgDQo+ICsgcGFyYWxsZWwgYXBwbHkNCj4gKyAqIHdvcmtlciB3 aWxsIGFwcGx5IHRoZXNlIGNoYW5nZXMgd2hlbiB0aGUgZmluYWwgY29tbWl0IGFycml2ZXMuDQo+ ICsgKg0KPiArICogT25lIG1pZ2h0IHRoaW5rIHdlIGNhbiB1c2UgTEVBREVSX1NFUklBTElaRSBk aXJlY3RseS4gQnV0IGluIA0KPiArIHBhcnRpYWwNCj4gKyAqIHNlcmlhbGl6ZSBtb2RlLCBpbiBh ZGRpdGlvbiB0byBzZXJpYWxpemluZyBjaGFuZ2VzIHRvIGZpbGUsIHRoZSANCj4gKyBsZWFkZXIN Cj4gKyAqIHdvcmtlciBuZWVkcyB0byB3cml0ZSB0aGUgU1RSRUFNX1hYWCBtZXNzYWdlIHRvIGRp c2ssIGFuZCBuZWVkcyB0byANCj4gKyB3YWl0DQo+IGZvcg0KPiArICogcGFyYWxsZWwgYXBwbHkg d29ya2VyIHRvIGZpbmlzaCB0aGUgdHJhbnNhY3Rpb24gd2hlbiBwcm9jZXNzaW5nIA0KPiArIHRo ZQ0KPiArICogdHJhbnNhY3Rpb24gZmluaXNoIGNvbW1hbmQuIFNvIGEgbmV3IGFjdGlvbiB3YXMg aW50cm9kdWNlZCB0byBtYWtlIA0KPiArIHRoZQ0KPiBsb2dpYw0KPiArICogY2xlYXJlci4NCj4g KyAqDQo+ICAgKiBUUkFOU19MRUFERVJfU0VORF9UT19QQVJBTExFTDoNCj4gDQo+IA0KPiBTVUdH RVNUSU9OIChNaW5vciB3b3JkaW5nIGNoYW5nZXMpDQo+IFRoZSBhY3Rpb24gbWVhbnMgdGhhdCB3 ZSBhcmUgaW4gdGhlIGxlYWRlciBhcHBseSB3b3JrZXIgYW5kIGhhdmUgc2VudCANCj4gc29tZSBj aGFuZ2VzIGRpcmVjdGx5IHRvIHRoZSBwYXJhbGxlbCBhcHBseSB3b3JrZXIsIGR1ZSB0byB0aW1l b3V0IA0KPiB3aGlsZSBzZW5kaW5nIGRhdGEgdGhlIHJlbWFpbmluZyBjaGFuZ2VzIG5lZWQgdG8g YmUgc2VyaWFsaXplZCB0byANCj4gZGlzay4gVGhlIHBhcmFsbGVsIGFwcGx5IHdvcmtlciB3aWxs IGFwcGx5IHRoZXNlIHNlcmlhbGl6ZWQgY2hhbmdlcyANCj4gd2hlbiB0aGUgZmluYWwgY29tbWl0 IGFycml2ZXMuDQo+IA0KPiBMRUFERVJfU0VSSUFMSVpFIGNvdWxkIG5vdCBiZSB1c2VkIGZvciB0 aGlzIGNhc2UgYmVjYXVzZSwgaW4gYWRkaXRpb24gDQo+IHRvIHNlcmlhbGl6aW5nIGNoYW5nZXMs IHRoZSBsZWFkZXIgd29ya2VyIGFsc28gbmVlZHMgdG8gd3JpdGUgdGhlIA0KPiBTVFJFQU1fWFhY IG1lc3NhZ2UgdG8gZGlzaywgYW5kIHdhaXQgZm9yIHRoZSBwYXJhbGxlbCBhcHBseSB3b3JrZXIg dG8gDQo+IGZpbmlzaCB0aGUgdHJhbnNhY3Rpb24gd2hlbiBwcm9jZXNzaW5nIHRoZSB0cmFuc2Fj dGlvbiBmaW5pc2ggY29tbWFuZC4NCj4gU28gdGhpcyBuZXcgYWN0aW9uIHdhcyBpbnRyb2R1Y2Vk IHRvIG1ha2UgdGhlIGxvZ2ljIGNsZWFyZXIuDQoNCkNoYW5nZWQuDQoNCj4gfg0KPiANCj4gMTUu DQo+ICAgLyogQWN0aW9ucyBmb3Igc3RyZWFtaW5nIHRyYW5zYWN0aW9ucy4gKi8NCj4gICBUUkFO U19MRUFERVJfU0VSSUFMSVpFLA0KPiArIFRSQU5TX0xFQURFUl9QQVJUSUFMX1NFUklBTElaRSwN Cj4gICBUUkFOU19MRUFERVJfU0VORF9UT19QQVJBTExFTCwNCj4gICBUUkFOU19QQVJBTExFTF9B UFBMWQ0KPiANCj4gQWx0aG91Z2ggaXQgbWFrZXMgbm8gZGlmZmVyZW5jZSBJIGZlbHQgaXQgd291 bGQgYmUgYmV0dGVyIHRvIHB1dCANCj4gVFJBTlNfTEVBREVSX1BBUlRJQUxfU0VSSUFMSVpFICph ZnRlciogVFJBTlNfTEVBREVSX1NFTkRfVE9fUEFSQUxMRUwgDQo+IGJlY2F1c2UgdGhhdCB3b3Vs ZCBiZSB0aGUgb3JkZXIgdGhhdCB0aGVzZSBtb2RlIGNoYW5nZXMgb2NjdXIgaW4gdGhlIA0KPiBs b2dpYy4uLg0KDQpJIHRob3VnaHQgdGhhdCBpdCBpcyBmaW5lIGFzIGl0IGZvbGxvd3MgTEVBREVS X1NFUklBTElaRSB3aGljaCBpcyBzaW1pbGFyIHRvDQpMRUFERVJfUEFSVElBTF9TRVJJQUxJWkUu DQoNCj4gfn5+DQo+IA0KPiAxNi4NCj4gDQo+IEBAIC0zNzUsNyArMzg4LDcgQEAgdHlwZWRlZiBz dHJ1Y3QgQXBwbHlTdWJYYWN0RGF0YSAgc3RhdGljIA0KPiBBcHBseVN1YlhhY3REYXRhIHN1Ynhh Y3RfZGF0YSA9IHswLCAwLCBJbnZhbGlkVHJhbnNhY3Rpb25JZCwgTlVMTH07DQo+IA0KPiAgc3Rh dGljIGlubGluZSB2b2lkIHN1YnhhY3RfZmlsZW5hbWUoY2hhciAqcGF0aCwgT2lkIHN1YmlkLCAN Cj4gVHJhbnNhY3Rpb25JZCB4aWQpOyAtc3RhdGljIGlubGluZSB2b2lkIGNoYW5nZXNfZmlsZW5h bWUoY2hhciAqcGF0aCwgDQo+IE9pZCBzdWJpZCwgVHJhbnNhY3Rpb25JZCB4aWQpOw0KPiAraW5s aW5lIHZvaWQgY2hhbmdlc19maWxlbmFtZShjaGFyICpwYXRoLCBPaWQgc3ViaWQsIFRyYW5zYWN0 aW9uSWQgDQo+ICt4aWQpOw0KPiANCj4gSUlVQyAoc2VlIFsxXSkgd2hlbiB0aGlzIGZ1bmN0aW9u IHdhcyBtYWRlIG5vbi1zdGF0aWMgdGhlICJpbmxpbmUiDQo+IHNob3VsZCBoYXZlIGJlZW4gcHV0 IGludG8gdGhlIGhlYWRlciBmaWxlLg0KDQpDaGFuZ2VkIHRoaXMgZnVuY3Rpb24gZnJvbSAiaW5s aW5lIHZvaWQiIHRvICJ2b2lkIiBhcyBJIGFtIG5vdCBzdXJlIGlzIGl0IGJldHRlciB0byBwdXQN CnRoaXMgZnVuY3Rpb24ncyBkZWZpbml0aW9uIG9uIGhlYWRlciBmaWxlLg0KDQo+IH4NCj4gDQo+ IDE3Lg0KPiBAQCAtMzg4LDEwICs0MDEsOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYW51cF9z dWJ4YWN0X2luZm8odm9pZCk7DQo+ICAvKg0KPiAgICogU2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6 ZSBjaGFuZ2VzIGZvciBhIHRvcGxldmVsIHRyYW5zYWN0aW9uLg0KPiAgICovDQo+IC1zdGF0aWMg dm9pZCBzdHJlYW1fY2xlYW51cF9maWxlcyhPaWQgc3ViaWQsIFRyYW5zYWN0aW9uSWQgeGlkKTsg DQo+IHN0YXRpYyB2b2lkIHN0cmVhbV9vcGVuX2ZpbGUoT2lkIHN1YmlkLCBUcmFuc2FjdGlvbklk IHhpZCwNCj4gICBib29sIGZpcnN0X3NlZ21lbnQpOw0KPiAtc3RhdGljIHZvaWQgc3RyZWFtX3dy aXRlX2NoYW5nZShjaGFyIGFjdGlvbiwgU3RyaW5nSW5mbyBzKTsNCj4gK3N0YXRpYyB2b2lkIHN0 cmVhbV93cml0ZV9tZXNzYWdlKFRyYW5zYWN0aW9uSWQgeGlkLCBjaGFyIGFjdGlvbiwgDQo+ICtT dHJpbmdJbmZvIHMpOw0KPiAgc3RhdGljIHZvaWQgc3RyZWFtX2Nsb3NlX2ZpbGUodm9pZCk7DQo+ IA0KPiAxN2EuDQo+IA0KPiBJIGZlbHQganVzdCBzYXlpbmcgImZpbGUvZmlsZXMiIGlzIHRvbyB2 YWd1ZS4gQWxsIHRoZSByZWZlcmVuY2VzIHRvIA0KPiB0aGUgZmlsZSBzaG91bGQgYmUgY29uc2lz dGVudCwgc28gSU1PIGV2ZXJ5dGhpbmcgd291bGQgYmUgYmV0dGVyIG5hbWVkDQo+IGxpa2U6DQo+ IA0KPiAic3RyZWFtX2NsZWFudXBfZmlsZXMiIC0+ICJzdHJlYW1fbXNnX3Nwb29sZmlsZV9jbGVh bnVwKCkiDQo+ICJzdHJlYW1fb3Blbl9maWxlIiAtPiAgInN0cmVhbV9tc2dfc3Bvb2xmaWxlX29w ZW4oKSINCj4gInN0cmVhbV9jbG9zZV9maWxlIiAtPiAic3RyZWFtX21zZ19zcG9vbGZpbGVfY2xv c2UoKSINCj4gInN0cmVhbV93cml0ZV9tZXNzYWdlIiAtPiAic3RyZWFtX21zZ19zcG9vbGZpbGVf d3JpdGVfbXNnKCkiDQoNClJlbmFtZWQgdGhlIGZ1bmN0aW9uIHN0cmVhbV93cml0ZV9tZXNzYWdl IHRvIHN0cmVhbV9vcGVuX2FuZF93cml0ZV9jaGFuZ2UuDQoNCj4gfg0KPiANCj4gMTdiLg0KPiBJ TU8gdGhlcmUgaXMgbm90IGVub3VnaCBkaXN0aW5jdGlvbiBoZXJlIGJldHdlZW4gZnVuY3Rpb24g bmFtZXMgDQo+IHN0cmVhbV93cml0ZV9tZXNzYWdlIGFuZCBzdHJlYW1fd3JpdGVfY2hhbmdlLiBl LmcuIFlvdSBjYW5ub3QgcmVhbGx5IA0KPiB0ZWxsIGZyb20gdGhlaXIgbmFtZXMgd2hhdCBtaWdo dCBiZSB0aGUgZGlmZmVyZW5jZS4NCg0KQ2hhbmdlZCB0aGUgbmFtZS4NCg0KPiB+fn4NCj4gDQo+ IDE4Lg0KPiANCj4gQEAgLTU4Niw2ICs1OTUsNyBAQCBoYW5kbGVfc3RyZWFtZWRfdHJhbnNhY3Rp b24oTG9naWNhbFJlcE1zZ1R5cGUNCj4gYWN0aW9uLCBTdHJpbmdJbmZvIHMpDQo+ICAgVHJhbnNh Y3Rpb25JZCBjdXJyZW50X3hpZDsNCj4gICBQYXJhbGxlbEFwcGx5V29ya2VySW5mbyAqd2luZm87 DQo+ICAgVHJhbnNBcHBseUFjdGlvbiBhcHBseV9hY3Rpb247DQo+ICsgU3RyaW5nSW5mb0RhdGEg b3JpZ2luYWxfbXNnOw0KPiANCj4gICBhcHBseV9hY3Rpb24gPSBnZXRfdHJhbnNhY3Rpb25fYXBw bHlfYWN0aW9uKHN0cmVhbV94aWQsICZ3aW5mbyk7DQo+IA0KPiBAQCAtNTk1LDYgKzYwNSw4IEBA IGhhbmRsZV9zdHJlYW1lZF90cmFuc2FjdGlvbihMb2dpY2FsUmVwTXNnVHlwZQ0KPiBhY3Rpb24s IFN0cmluZ0luZm8gcykNCj4gDQo+ICAgQXNzZXJ0KFRyYW5zYWN0aW9uSWRJc1ZhbGlkKHN0cmVh bV94aWQpKTsNCj4gDQo+ICsgb3JpZ2luYWxfbXNnID0gKnM7DQo+ICsNCj4gICAvKg0KPiAgICog V2Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgWElEIG9mIHRoZSBzdWJ4YWN0IGFzIHRoZSBmaXJzdCBw YXJ0IG9mIHRoZQ0KPiAgICogbWVzc2FnZSwgc28gZXh0cmFjdCBpdC4NCj4gQEAgLTYxOCwxMCAr NjMwLDE0IEBAIGhhbmRsZV9zdHJlYW1lZF90cmFuc2FjdGlvbihMb2dpY2FsUmVwTXNnVHlwZQ0K PiBhY3Rpb24sIFN0cmluZ0luZm8gcykNCj4gICBzdHJlYW1fd3JpdGVfY2hhbmdlKGFjdGlvbiwg cyk7DQo+ICAgcmV0dXJuIHRydWU7DQo+IA0KPiArIGNhc2UgVFJBTlNfTEVBREVSX1BBUlRJQUxf U0VSSUFMSVpFOg0KPiAgIGNhc2UgVFJBTlNfTEVBREVSX1NFTkRfVE9fUEFSQUxMRUw6DQo+ICAg QXNzZXJ0KHdpbmZvKTsNCj4gDQo+IC0gcGFfc2VuZF9kYXRhKHdpbmZvLCBzLT5sZW4sIHMtPmRh dGEpOw0KPiArIGlmIChhcHBseV9hY3Rpb24gPT0gVFJBTlNfTEVBREVSX1NFTkRfVE9fUEFSQUxM RUwpIA0KPiArIHBhX3NlbmRfZGF0YSh3aW5mbywgcy0+bGVuLCBzLT5kYXRhKTsgZWxzZSANCj4g KyBzdHJlYW1fd3JpdGVfY2hhbmdlKGFjdGlvbiwgJm9yaWdpbmFsX21zZyk7DQo+IA0KPiBUaGUg b3JpZ2luYWxfbXNnIGlzIG5vdCB1c2VkIGV4Y2VwdCBmb3IgVFJBTlNfTEVBREVSX1BBUlRJQUxf U0VSSUFMSVpFIA0KPiBjYXNlIHNvIEkgdGhpbmsgaXQgc2hvdWxkIG9ubHkgYmUgZGVjbGFyZWQv YXNzaWduZWQgaW4gdGhlIHNjb3BlIG9mIA0KPiB0aGF0ICdlbHNlJw0KDQpUaGUgbWVtYmVyICdj dXJzb3InIG9mICdzJyBpcyBjaGFuZ2VkIGFmdGVyIGludm9raW5nIHRoZSBmdW5jdGlvbiBwcV9n ZXRtc2dpbnQuDQpTbyAnb3JpZ2luYWxfbXNnJyBpcyBhc3NpZ25lZCBiZWZvcmUgaW52b2tpbmcg dGhlIGZ1bmN0aW9uIHBxX2dldG1zZ2ludC4NCg0KPiB+DQo+IA0KPiAyMC4NCj4gDQo+ICsgLyoN Cj4gKyAqIENsb3NlIHRoZSBmaWxlIGJlZm9yZSBjb21taXR0aW5nIGlmIHRoZSBwYXJhbGxlbCBh cHBseSBpcw0KPiArICogYXBwbHlpbmcgc3Bvb2xlZCBjaGFuZ2VzLg0KPiArICovDQo+ICsgaWYg KHN0cmVhbV9mZCkNCj4gKyBCdWZGaWxlQ2xvc2Uoc3RyZWFtX2ZkKTsNCj4gDQo+IEkgZm91bmQg dGhpcyBhIGJpdCBjb25mdXNpbmcgYmVjYXVzZSB0aGVyZSBpcyBhbHJlYWR5IGENCj4gc3RyZWFt X2Nsb3NlX2ZpbGUoKSB3cmFwcGVyIGZ1bmN0aW9uIHdoaWNoIGRvZXMgYWxtb3N0IHRoZSBzYW1l IGFzIA0KPiB0aGlzLiBTbyBlaXRoZXIgdGhpcyBjb2RlIHNob3VsZCBiZSBjYWxsaW5nIHRoYXQg ZnVuY3Rpb24sIG9yIHRoZSANCj4gY29tbWVudCBoZXJlIHNob3VsZCBiZSBleHBsYWluaW5nIHdo eSB0aGlzIGNvZGUgaXMgTk9UIGNhbGxpbmcgdGhhdCANCj4gZnVuY3Rpb24uDQoNCkNoYW5nZWQu DQoNCj4gfn5+DQo+IA0KPiAyMS4gc2VyaWFsaXplX3N0cmVhbV9zdGFydA0KPiANCj4gKy8qDQo+ ICsgKiBJbml0aWFsaXplIGZpbGVzZXQgKGlmIG5vdCBhbHJlYWR5IGRvbmUpLg0KPiArICoNCj4g KyAqIENyZWF0ZSBhIG5ldyBmaWxlIHdoZW4gZmlyc3Rfc2VnbWVudCBpcyB0cnVlLCBvdGhlcndp c2Ugb3BlbiB0aGUgDQo+ICtleGlzdGluZw0KPiArICogZmlsZS4NCj4gKyAqLw0KPiArdm9pZA0K PiArc2VyaWFsaXplX3N0cmVhbV9zdGFydChUcmFuc2FjdGlvbklkIHhpZCwgYm9vbCBmaXJzdF9z ZWdtZW50KQ0KPiANCj4gSU1PIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBzdHJlYW1f bXNnX3Nwb29sZmlsZV9pbml0KCkgb3INCj4gc3RyZWFtX21zZ19zcG9vbGZpbGVfYmVnaW4oKSB0 byBtYXRjaCB0aGUgcGF0dGVybiBmb3IgZnVuY3Rpb24gbmFtZXMgDQo+IG9mIHRoZSBtZXNzYWdl IHNwb29sIGZpbGUgdGhhdCBJIHByZXZpb3VzbHkgc3VnZ2VzdGVkLiAoc2VlIHJldmlldyANCj4g Y29tbWVudCAjMTdhKQ0KDQpJIGFtIG5vdCBzdXJlIGFib3V0IHRoZSBuYW1lIGlzIGJldHRlci4g SSB3aWxsIHRoaW5rIG92ZXIgdGhpcyBhbmQgYWRqdXN0IGluIG5leHQgdmVyc2lvbi4NCg0KPiB+ DQo+IA0KPiAyMi4NCj4gDQo+ICsgLyoNCj4gKyAqIEluaXRpYWxpemUgdGhlIHdvcmtlcidzIHN0 cmVhbV9maWxlc2V0IGlmIHdlIGhhdmVuJ3QgeWV0LiBUaGlzIA0KPiArIHdpbGwgYmUNCj4gKyAq IHVzZWQgZm9yIHRoZSBlbnRpcmUgZHVyYXRpb24gb2YgdGhlIHdvcmtlciBzbyBjcmVhdGUgaXQg aW4gYSANCj4gKyBwZXJtYW5lbnQNCj4gKyAqIGNvbnRleHQuIFdlIGNyZWF0ZSB0aGlzIG9uIHRo ZSB2ZXJ5IGZpcnN0IHN0cmVhbWluZyBtZXNzYWdlIGZyb20gDQo+ICsgYW55DQo+ICsgKiB0cmFu c2FjdGlvbiBhbmQgdGhlbiB1c2UgaXQgZm9yIHRoaXMgYW5kIG90aGVyIHN0cmVhbWluZyB0cmFu c2FjdGlvbnMuDQo+ICsgKiBOb3csIHdlIGNvdWxkIGNyZWF0ZSBhIGZpbGVzZXQgYXQgdGhlIHN0 YXJ0IG9mIHRoZSB3b3JrZXIgYXMgd2VsbCANCj4gKyBidXQNCj4gKyAqIHRoZW4gd2Ugd29uJ3Qg YmUgc3VyZSB0aGF0IGl0IHdpbGwgZXZlciBiZSB1c2VkLg0KPiArICovDQo+ICsgaWYgKCFNeUxv Z2ljYWxSZXBXb3JrZXItPnN0cmVhbV9maWxlc2V0KQ0KPiANCj4gSSBhc3N1bWVkIHRoaXMgaXMg YSB0eXBvICJOb3csIiAtLT4gIk5vdGUsIiA/DQoNClRoYXQgc2VlbXMgdGhlIGV4aXN0aW5nIGNv bW1lbnRzLCBJIGFtIG5vdCBzdXJlIGl0J3MgYSB0eXBvIG9yIG5vdC4NCg0KPiB+DQo+IA0KPiAy NC4NCj4gDQo+ICAgLyoNCj4gLSAqIFN0YXJ0IGEgdHJhbnNhY3Rpb24gb24gc3RyZWFtIHN0YXJ0 LCB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgYmUNCj4gLSAqIGNvbW1pdHRlZCBvbiB0aGUgc3RyZWFt IHN0b3AgdW5sZXNzIGl0IGlzIGEgdGFibGVzeW5jIHdvcmtlciBpbg0KPiAtICogd2hpY2ggY2Fz ZSBpdCB3aWxsIGJlIGNvbW1pdHRlZCBhZnRlciBwcm9jZXNzaW5nIGFsbCB0aGUNCj4gLSAqIG1l c3NhZ2VzLiBXZSBuZWVkIHRoZSB0cmFuc2FjdGlvbiBmb3IgaGFuZGxpbmcgdGhlIGJ1ZmZpbGUs DQo+IC0gKiB1c2VkIGZvciBzZXJpYWxpemluZyB0aGUgc3RyZWFtaW5nIGRhdGEgYW5kIHN1Ynhh Y3QgaW5mby4NCj4gKyAqIHNlcmlhbGl6ZV9zdHJlYW1fc3RhcnQgd2lsbCBzdGFydCBhIHRyYW5z YWN0aW9uLCB0aGlzDQo+ICsgKiB0cmFuc2FjdGlvbiB3aWxsIGJlIGNvbW1pdHRlZCBvbiB0aGUg c3RyZWFtIHN0b3AgdW5sZXNzIGl0IGlzIGENCj4gKyAqIHRhYmxlc3luYyB3b3JrZXIgaW4gd2hp Y2ggY2FzZSBpdCB3aWxsIGJlIGNvbW1pdHRlZCBhZnRlcg0KPiArICogcHJvY2Vzc2luZyBhbGwg dGhlIG1lc3NhZ2VzLiBXZSBuZWVkIHRoZSB0cmFuc2FjdGlvbiBmb3INCj4gKyAqIGhhbmRsaW5n IHRoZSBidWZmaWxlLCB1c2VkIGZvciBzZXJpYWxpemluZyB0aGUgc3RyZWFtaW5nIGRhdGENCj4g KyAqIGFuZCBzdWJ4YWN0IGluZm8uDQo+ICAgKi8NCj4gLSBiZWdpbl9yZXBsaWNhdGlvbl9zdGVw KCk7DQo+ICsgc2VyaWFsaXplX3N0cmVhbV9zdGFydChzdHJlYW1feGlkLCBmaXJzdF9zZWdtZW50 KTsgYnJlYWs7DQo+IA0KPiBNYWtlIHRoZSBjb21tZW50IGEgYml0IG1vcmUgbmF0dXJhbC4NCj4g DQo+IFNVR0dFU1RJT04NCj4gDQo+IEZ1bmN0aW9uIHNlcmlhbGl6ZV9zdHJlYW1fc3RhcnQgc3Rh cnRzIGEgdHJhbnNhY3Rpb24uIFRoaXMgdHJhbnNhY3Rpb24gDQo+IHdpbGwgYmUgY29tbWl0dGVk IG9uIHRoZSBzdHJlYW0gc3RvcCB1bmxlc3MgaXQgaXMgYSB0YWJsZXN5bmMgd29ya2VyIA0KPiBp biB3aGljaCBjYXNlIGl0IHdpbGwgYmUgY29tbWl0dGVkIGFmdGVyIHByb2Nlc3NpbmcgYWxsIHRo ZSBtZXNzYWdlcy4NCj4gV2UgbmVlZCB0aGlzIHRyYW5zYWN0aW9uIGZvciBoYW5kbGluZyB0aGUg QnVmRmlsZSwgdXNlZCBmb3IgDQo+IHNlcmlhbGl6aW5nIHRoZSBzdHJlYW1pbmcgZGF0YSBhbmQg c3VieGFjdCBpbmZvLg0KDQpDaGFuZ2VkLg0KDQo+IH4NCj4gDQo+IDI1Lg0KPiANCj4gKyBjYXNl IFRSQU5TX0xFQURFUl9QQVJUSUFMX1NFUklBTElaRToNCj4gICAvKg0KPiAtICogSW5pdGlhbGl6 ZSB0aGUgd29ya2VyJ3Mgc3RyZWFtX2ZpbGVzZXQgaWYgd2UgaGF2ZW4ndCB5ZXQuIFRoaXMNCj4g LSAqIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGVudGlyZSBkdXJhdGlvbiBvZiB0aGUgd29ya2VyIHNv IGNyZWF0ZSBpdA0KPiAtICogaW4gYSBwZXJtYW5lbnQgY29udGV4dC4gV2UgY3JlYXRlIHRoaXMg b24gdGhlIHZlcnkgZmlyc3QNCj4gLSAqIHN0cmVhbWluZyBtZXNzYWdlIGZyb20gYW55IHRyYW5z YWN0aW9uIGFuZCB0aGVuIHVzZSBpdCBmb3IgdGhpcw0KPiAtICogYW5kIG90aGVyIHN0cmVhbWlu ZyB0cmFuc2FjdGlvbnMuIE5vdywgd2UgY291bGQgY3JlYXRlIGENCj4gLSAqIGZpbGVzZXQgYXQg dGhlIHN0YXJ0IG9mIHRoZSB3b3JrZXIgYXMgd2VsbCBidXQgdGhlbiB3ZSB3b24ndCBiZQ0KPiAt ICogc3VyZSB0aGF0IGl0IHdpbGwgZXZlciBiZSB1c2VkLg0KPiArICogVGhlIGZpbGUgc2hvdWxk IGhhdmUgYmVlbiBjcmVhdGVkIHdoZW4gZW50ZXJpbmcNCj4gKyAqIFBBUlRJQUxfU0VSSUFMSVpF IG1vZGUgc28gbm8gbmVlZCB0byBjcmVhdGUgaXQgYWdhaW4uIFRoZQ0KPiArICogdHJhbnNhY3Rp b24gc3RhcnRlZCBpbiBzZXJpYWxpemVfc3RyZWFtX3N0YXJ0IHdpbGwgYmUgY29tbWl0dGVkDQo+ ICsgKiBvbiB0aGUgc3RyZWFtIHN0b3AuDQo+ICAgKi8NCj4gLSBpZiAoIU15TG9naWNhbFJlcFdv cmtlci0+c3RyZWFtX2ZpbGVzZXQpDQo+IA0KPiBCRUZPUkUNCj4gVGhlIGZpbGUgc2hvdWxkIGhh dmUgYmVlbiBjcmVhdGVkIHdoZW4gZW50ZXJpbmcgUEFSVElBTF9TRVJJQUxJWkUgbW9kZSANCj4g c28gbm8gbmVlZCB0byBjcmVhdGUgaXQgYWdhaW4uDQo+IA0KPiBTVUdHRVNUSU9ODQo+IFRoZSBt ZXNzYWdlIHNwb29sIGZpbGUgd2FzIGFscmVhZHkgY3JlYXRlZCB3aGVuIGVudGVyaW5nIA0KPiBQ QVJUSUFMX1NFUklBTElaRSBtb2RlLg0KDQpDaGFuZ2VkLg0KDQo+IH5+fg0KPiANCj4gMjYuIHNl cmlhbGl6ZV9zdHJlYW1fc3RvcA0KPiANCj4gIC8qDQo+ICsgKiBVcGRhdGUgdGhlIGluZm9ybWF0 aW9uIGFib3V0IHN1YnhhY3RzIGFuZCBjbG9zZSB0aGUgZmlsZS4NCj4gKyAqDQo+ICsgKiBUaGlz IGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgc2VyaWFsaXplX3N0cmVhbV9zdGFy dCANCj4gK2Z1bmN0aW9uIGhhcw0KPiArICogYmVlbiBjYWxsZWQuDQo+ICsgKi8NCj4gK3ZvaWQN Cj4gK3NlcmlhbGl6ZV9zdHJlYW1fc3RvcChUcmFuc2FjdGlvbklkIHhpZCkNCj4gDQo+IE1heWJl IDJuZCBwYXJ0IG9mIHRoYXQgY29tbWVudCBzaG91bGQgYmUgc29tZXRoaW5nIG1vcmUgbGlrZQ0K PiANCj4gU1VHR0VTVElPTg0KPiBUaGlzIGZ1bmN0aW9uIGVuZHMgd2hhdCB3YXMgc3RhcnRlZCBi eSB0aGUgZnVuY3Rpb24gc2VyaWFsaXplX3N0cmVhbV9zdGFydCgpLg0KDQpJIGFtIHRoaW5raW5n IGFib3V0IGEgbmV3IGZ1bmN0aW9uIG5hbWUgYW5kIHdpbGwgYWRqdXN0IHRoaXMgaW4gbmV4dCB2 ZXJzaW9uLg0KDQo+IH4NCj4gDQo+IDI3Lg0KPiANCj4gKyAvKg0KPiArICogQ2xvc2UgdGhlIGZp bGUgd2l0aCBzZXJpYWxpemVkIGNoYW5nZXMsIGFuZCBzZXJpYWxpemUgaW5mb3JtYXRpb24gDQo+ ICsgYWJvdXQNCj4gKyAqIHN1YnhhY3RzIGZvciB0aGUgdG9wbGV2ZWwgdHJhbnNhY3Rpb24uDQo+ ICsgKi8NCj4gKyBzdWJ4YWN0X2luZm9fd3JpdGUoTXlMb2dpY2FsUmVwV29ya2VyLT5zdWJpZCwg eGlkKTsgDQo+ICsgc3RyZWFtX2Nsb3NlX2ZpbGUoKTsNCj4gDQo+IFNob3VsZCB0aGUgY29tbWVu dCBhbmQgdGhlIGNvZGUgYmUgaW4gdGhlIHNhbWUgb3JkZXI/DQo+IA0KPiBTVUdHRVNUSU9ODQo+ IFNlcmlhbGl6ZSBpbmZvcm1hdGlvbiBhYm91dCBzdWJ4YWN0cyBmb3IgdGhlIHRvcGxldmVsIHRy YW5zYWN0aW9uLCANCj4gdGhlbiBjbG9zZSB0aGUgc3RyZWFtIG1lc3NhZ2VzIHNwb29sIGZpbGUu DQoNCkNoYW5nZWQuDQoNCj4gfn5+DQo+IA0KPiAyOC4gaGFuZGxlX3N0cmVhbV9hYm9ydA0KPiAN Cj4gKyBjYXNlIFRSQU5TX0xFQURFUl9QQVJUSUFMX1NFUklBTElaRToNCj4gKyBBc3NlcnQod2lu Zm8pOw0KPiArDQo+ICsgLyoNCj4gKyAqIFBhcmFsbGVsIGFwcGx5IHdvcmtlciBtaWdodCBoYXZl IGFwcGxpZWQgc29tZSBjaGFuZ2VzLCBzbyB3cml0ZQ0KPiArICogdGhlIFNUUkVBTV9BQk9SVCBt ZXNzYWdlIHNvIHRoYXQgdGhlIHBhcmFsbGVsIGFwcGx5IHdvcmtlciBjYW4NCj4gKyAqIHJvbGxi YWNrIHRoZSBzdWJ0cmFuc2FjdGlvbiBpZiBuZWVkZWQuDQo+ICsgKi8NCj4gKyBzdHJlYW1fd3Jp dGVfbWVzc2FnZSh4aWQsIExPR0lDQUxfUkVQX01TR19TVFJFQU1fQUJPUlQsIA0KPiArICZvcmln aW5hbF9tc2cpOw0KPiArDQo+IA0KPiAyOGEuDQo+IFRoZSBvcmlnaW5hbF9tc2cgaXMgbm90IHVz ZWQgZXhjZXB0IGZvciBUUkFOU19MRUFERVJfUEFSVElBTF9TRVJJQUxJWkUgDQo+IGNhc2Ugc28g SSB0aGluayBpdCBzaG91bGQgb25seSBiZSBkZWNsYXJlZC9hc3NpZ25lZCBpbiB0aGUgc2NvcGUg b2YgDQo+IHRoYXQgY2FzZS4NCj4gDQo+IH4NCj4gDQo+IDI4Yi4NCj4gInNvIHRoYXQgdGhlIHBh cmFsbGVsIGFwcGx5IHdvcmtlciBjYW4iIC0+ICJzbyB0aGF0IGl0IGNhbiINCg0KQ2hhbmdlZC4N Cg0KPiB+fn4NCj4gDQo+IDI5LiBhcHBseV9zcG9vbGVkX21lc3NhZ2VzDQo+IA0KPiArdm9pZA0K PiArYXBwbHlfc3Bvb2xlZF9tZXNzYWdlcyhGaWxlU2V0ICpzdHJlYW1fZmlsZXNldCwgVHJhbnNh Y3Rpb25JZCB4aWQsDQo+ICsgICAgWExvZ1JlY1B0ciBsc24pDQo+ICB7DQo+ICAgU3RyaW5nSW5m b0RhdGEgczI7DQo+ICAgaW50IG5jaGFuZ2VzOw0KPiAgIGNoYXIgcGF0aFtNQVhQR1BBVEhdOw0K PiAgIGNoYXIgICAgKmJ1ZmZlciA9IE5VTEw7DQo+ICAgTWVtb3J5Q29udGV4dCBvbGRjeHQ7DQo+ IC0gQnVmRmlsZSAgICAqZmQ7DQo+IA0KPiAtIG1heWJlX3N0YXJ0X3NraXBwaW5nX2NoYW5nZXMo bHNuKTsNCj4gKyBpZiAoIWFtX3BhcmFsbGVsX2FwcGx5X3dvcmtlcigpKQ0KPiArIG1heWJlX3N0 YXJ0X3NraXBwaW5nX2NoYW5nZXMobHNuKTsNCj4gDQo+ICAgLyogTWFrZSBzdXJlIHdlIGhhdmUg YW4gb3BlbiB0cmFuc2FjdGlvbiAqLw0KPiAgIGJlZ2luX3JlcGxpY2F0aW9uX3N0ZXAoKTsNCj4g QEAgLTE4MTAsOCArMTkxMyw4IEBAIGFwcGx5X3Nwb29sZWRfbWVzc2FnZXMoVHJhbnNhY3Rpb25J ZCB4aWQsIA0KPiBYTG9nUmVjUHRyIGxzbikNCj4gICBjaGFuZ2VzX2ZpbGVuYW1lKHBhdGgsIE15 TG9naWNhbFJlcFdvcmtlci0+c3ViaWQsIHhpZCk7DQo+ICAgZWxvZyhERUJVRzEsICJyZXBsYXlp bmcgY2hhbmdlcyBmcm9tIGZpbGUgXCIlc1wiIiwgcGF0aCk7DQo+IA0KPiAtIGZkID0gQnVmRmls ZU9wZW5GaWxlU2V0KE15TG9naWNhbFJlcFdvcmtlci0+c3RyZWFtX2ZpbGVzZXQsIHBhdGgsIA0K PiBPX1JET05MWSwNCj4gLSBmYWxzZSk7DQo+ICsgc3RyZWFtX2ZkID0gQnVmRmlsZU9wZW5GaWxl U2V0KHN0cmVhbV9maWxlc2V0LCBwYXRoLCBPX1JET05MWSwgDQo+ICsgZmFsc2UpOyBzdHJlYW1f eGlkID0geGlkOw0KPiANCj4gSU1PIGl0IHNlZW1zIHN0cmFuZ2UgdG8gbWUgdGhhdCB0aGUgZmls ZXNldCBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgDQo+IGJ1dCB0aGVuIHRoZSByZXN1bHRpbmcg ZmQgaXMgYWx3YXlzIGFzc2lnbmVkIHRvIGEgc2luZ2xlIGdsb2JhbCANCj4gdmFyaWFibGUgKHJl Z2FyZGxlc3Mgb2Ygd2hhdCB0aGUgZmlsZXNldCB3YXMgcGFzc2VkKS4NCg0KSSBhbSBub3Qgc3Vy ZSBhYm91dCB0aGlzIGFzIHdlIGFscmVhZHkgaGF2ZSBzaW1pbGFyIGNvZGUgaW4gc3RyZWFtX29w ZW5fZmlsZSgpLg0KDQo+IH4NCj4gDQo+IDMwLg0KPiANCj4gLSBCdWZGaWxlQ2xvc2UoZmQpOw0K PiAtDQo+ICsgQnVmRmlsZUNsb3NlKHN0cmVhbV9mZCk7DQo+ICAgcGZyZWUoYnVmZmVyKTsNCj4g ICBwZnJlZShzMi5kYXRhKTsNCj4gDQo+ICtkb25lOg0KPiArIHN0cmVhbV9mZCA9IE5VTEw7DQo+ ICsgc3RyZWFtX3hpZCA9IEludmFsaWRUcmFuc2FjdGlvbklkOw0KPiArDQo+IA0KPiBUaGlzIGNv ZGUgZnJhZ21lbnQgc2VlbXMgdG8gYmUgZG9pbmcgYWxtb3N0IHRoZSBzYW1lIGFzIHdoYXQgZnVu Y3Rpb24NCj4gc3RyZWFtX2Nsb3NlX2ZpbGUoKSBpcyBkb2luZy4gU2hvdWxkIHlvdSBqdXN0IGNh bGwgdGhhdCBpbnN0ZWFkPw0KDQpDaGFuZ2VkLg0KDQo+ID09PT09PQ0KPiANCj4gc3JjL2luY2x1 ZGUvcmVwbGljYXRpb24vd29ya2VyX2ludGVybmFsLmgNCj4gDQo+IDMzLiBMZWFkZXJGaWxlU2V0 U3RhdGUNCj4gDQo+ICsvKiBTdGF0ZSBvZiBmaWxlc2V0IGluIGxlYWRlciBhcHBseSB3b3JrZXIu ICovIHR5cGVkZWYgZW51bSANCj4gK0xlYWRlckZpbGVTZXRTdGF0ZSB7ICBMRUFERVJfRklMRVNF VF9VTktOT1dOLCAgTEVBREVSX0ZJTEVTRVRfQlVTWSwgDQo+ICtMRUFERVJfRklMRVNFVF9BQ0NF U1NJQkxFIH0gTGVhZGVyRmlsZVNldFN0YXRlOw0KPiANCj4gMzNhLg0KPiANCj4gTWlzc2luZyBm cm9tIHR5cGVkZWZzLmxpc3Q/DQo+IA0KPiB+DQo+IA0KPiAzM2IuDQo+IA0KPiBJIHRob3VnaHQg c29tZSBtb3JlIGV4cGxhbmF0b3J5IGNvbW1lbnRzIGZvciB0aGUgbWVhbmluZyBvZiANCj4gQlVT WS9BQ0NFU1NJQkxFIHNob3VsZCBiZSBoZXJlLg0KPg0KPiB+DQo+IA0KPiAzM2MuDQo+IA0KPiBS RUFEWSBtaWdodCBiZSBhIGJldHRlciB2YWx1ZSB0aGFuIEFDQ0VTU0lCTEUNCj4gDQo+IH4NCj4g DQo+IDMzZC4NCj4gSSdtIG5vdCBzdXJlIHdoYXQgdXNlZnVsbmVzcyBkb2VzIHRoZSAiTEVBREVS XyIgYW5kICJMZWFkZXIiIHByZWZpeGVzIA0KPiBnaXZlIGhlcmUuIE1heWJlIGEgbmFtZSBsaWtl IFBhcnRpYWxGaWxlU2V0U3RhdCBpcyBtb3JlIG1lYW5pbmdmdWw/DQo+IA0KPiBlLmcuIGxpa2Ug dGhpcz8NCj4gDQo+IHR5cGVkZWYgZW51bSBQYXJ0aWFsRmlsZVNldFN0YXRlDQo+IHsNCj4gRlNf VU5LTk9XTiwNCj4gRlNfQlVTWSwNCj4gRlNfUkVBRFkNCj4gfSBQYXJ0aWFsRmlsZVNldFN0YXRl Ow0KDQpDaGFuZ2VkLg0KDQo+IH5+fg0KPiANCj4gMzQuIFBhcmFsbGVsQXBwbHlXb3JrZXJTaGFy ZWQNCj4gDQo+ICsgLyoNCj4gKyAqIFRoZSBsZWFkZXIgYXBwbHkgd29ya2VyIHdpbGwgc2VyaWFs aXplIGNoYW5nZXMgdG8gdGhlIGZpbGUgYWZ0ZXINCj4gKyAqIGVudGVyaW5nIFBBUlRJQUxfU0VS SUFMSVpFIG1vZGUgYW5kIHNoYXJlIHRoZSBmaWxlc2V0IHdpdGggdGhlIA0KPiArIHBhcmFsbGVs DQo+ICsgKiBhcHBseSB3b3JrZXIgd2hlbiBwcm9jZXNzaW5nIHRoZSB0cmFuc2FjdGlvbiBmaW5p c2ggY29tbWFuZC4gQW5kIA0KPiArIHRoZW4NCj4gKyAqIHRoZSBwYXJhbGxlbCBhcHBseSB3b3Jr ZXIgd2lsbCBhcHBseSBhbGwgdGhlIHNwb29sZWQgbWVzc2FnZXMuDQo+ICsgKg0KPiArICogRG9u J3QgdXNlIFNoYXJlZEZpbGVTZXQgaGVyZSBhcyB3ZSBuZWVkIHRoZSBmaWxlc2V0IHRvIHN1cnZp dmUgDQo+ICsgYWZ0ZXINCj4gKyAqIHJlbGVhc2luZyB0aGUgc2hhcmVkIG1lbW9yeSBzbyB0aGF0 IHRoZSBsZWFkZXIgYXBwbHkgd29ya2VyIGNhbiANCj4gKyByZS11c2UNCj4gKyAqIHRoZSBmaWxl c2V0IGZvciBuZXh0IHN0cmVhbWluZyB0cmFuc2FjdGlvbi4NCj4gKyAqLw0KPiArIExlYWRlckZp bGVTZXRTdGF0ZSBmaWxlc2V0X3N0YXRlOw0KPiArIEZpbGVTZXQgZmlsZXNldDsNCj4gDQo+IE1p bm9yIHJld29yZGluZyBvZiB0aGF0IGNvbW1lbnQNCj4gDQo+IFNVR0dFU1RJT04NCj4gQWZ0ZXIg ZW50ZXJpbmcgUEFSVElBTF9TRVJJQUxJWkUgbW9kZSwgdGhlIGxlYWRlciBhcHBseSB3b3JrZXIg d2lsbCANCj4gc2VyaWFsaXplIGNoYW5nZXMgdG8gdGhlIGZpbGUsIGFuZCBzaGFyZSB0aGUgZmls ZXNldCB3aXRoIHRoZSBwYXJhbGxlbCANCj4gYXBwbHkgd29ya2VyIHdoZW4gcHJvY2Vzc2luZyB0 aGUgdHJhbnNhY3Rpb24gZmluaXNoIGNvbW1hbmQuIFRoZW4gdGhlIA0KPiBwYXJhbGxlbCBhcHBs eSB3b3JrZXIgd2lsbCBhcHBseSBhbGwgdGhlIHNwb29sZWQgbWVzc2FnZXMuDQo+IA0KPiBGaWxl U2V0IGlzIHVzZWQgaGVyZSBpbnN0ZWFkIG9mIFNoYXJlZEZpbGVTZXQgYmVjYXVzZSB3ZSBuZWVk IGl0IHRvIA0KPiBzdXJ2aXZlIGFmdGVyIHJlbGVhc2luZyB0aGUgc2hhcmVkIG1lbW9yeSBzbyB0 aGF0IHRoZSBsZWFkZXIgYXBwbHkgDQo+IHdvcmtlciBjYW4gcmUtdXNlIHRoZSBzYW1lIGZpbGVz ZXQgZm9yIHRoZSBuZXh0IHN0cmVhbWluZyB0cmFuc2FjdGlvbi4NCg0KQ2hhbmdlZC4NCg0KPiB+ fn4NCj4gDQo+IDM1LiBnbG9iYWxzDQo+IA0KPiAgIC8qDQo+ICsgKiBJbmRpY2F0ZXMgd2hldGhl ciB0aGUgbGVhZGVyIGFwcGx5IHdvcmtlciBuZWVkcyB0byBzZXJpYWxpemUgdGhlDQo+ICsgKiBy ZW1haW5pbmcgY2hhbmdlcyB0byBkaXNrIGR1ZSB0byB0aW1lb3V0IHdoZW4gc2VuZGluZyBkYXRh IHRvIHRoZQ0KPiArICogcGFyYWxsZWwgYXBwbHkgd29ya2VyLg0KPiArICovDQo+ICsgYm9vbCBz ZXJpYWxpemVfY2hhbmdlczsNCj4gDQo+IDM1YS4NCj4gSSB3b25kZXIgaWYgdGhlIGNvbW1lbnQg d291bGQgYmUgYmV0dGVyIHRvIGFsc28gbWVudGlvbiAidmlhIHNoYXJlZCBtZW1vcnkiLg0KPiAN Cj4gU1VHR0VTVElPTg0KPiANCj4gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxlYWRlciBhcHBseSB3 b3JrZXIgbmVlZHMgdG8gc2VyaWFsaXplIHRoZSANCj4gcmVtYWluaW5nIGNoYW5nZXMgdG8gZGlz ayBkdWUgdG8gdGltZW91dCB3aGVuIGF0dGVtcHRpbmcgdG8gc2VuZCBkYXRhIA0KPiB0byB0aGUg cGFyYWxsZWwgYXBwbHkgd29ya2VyIHZpYSBzaGFyZWQgbWVtb3J5Lg0KDQpDaGFuZ2VkLg0KDQpC ZXN0IHJlZ2FyZHMsDQpIb3UgemoNCg==