Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wRuG2-002nQ1-2y for pgsql-hackers@arkaria.postgresql.org; Tue, 26 May 2026 16:03:55 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wRuG0-00546o-2i for pgsql-hackers@arkaria.postgresql.org; Tue, 26 May 2026 16:03:53 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wRuG0-00546g-1P for pgsql-hackers@lists.postgresql.org; Tue, 26 May 2026 16:03:53 +0000 Received: from mail-ej1-x62f.google.com ([2a00:1450:4864:20::62f]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wRuFy-00000001XfA-39mZ for pgsql-hackers@lists.postgresql.org; Tue, 26 May 2026 16:03:52 +0000 Received: by mail-ej1-x62f.google.com with SMTP id a640c23a62f3a-bd8d0e4e341so1521841366b.0 for ; Tue, 26 May 2026 09:03:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779811428; cv=none; d=google.com; s=arc-20240605; b=Vlb7ZYNw3QtccwdZNnDSEnNyvveEmiPBVrvtn27vYWbmTk5ofnx83/uVJTKOZvgR3M GFl/zeKgtY9uS3J5id8pMQEk2rfOhGiYkMK/Lle38lKLIGihfKQaj97j52hdeCGgylXP YXqXJjPV8Z5cFvXQh8p0EwDYCNDiB1ukduqYdkyUDZ6SHtpPRN+mb/70vGl7kc2drq/4 titYlHNo9+CY3YhNL5Gs57AIYcOuQuqy1jkQ8bK1/6/HodKM9+ce8Klk3MmGtzw0rzXz klTp3Pp2AT89YmWKax4SzLZ+oFsJBDVmG2oRKfM3Sgk4ArZ/xIc1jtQxFebP8020a6es eDhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=aPmXfRnZsF6YjZAZtu+X3RWzn2iAMkkP10VxjHyn+7A=; fh=6dmgmGtA8U+WtyhjCEr+MIcPCSTrryFdquDgheuIhsY=; b=Jyrd7K18n+9vGEmP4HT88EcIN0I2jLn6I5wsuO/KOMuRtjsrXanUBL65NwpaJS1ZMo ldKFECPP2honMuTKJCGEkSMoZJ7M4E0ZSH4LvpiV5sTH1U1KuublmwT4f0ua/msQRtlQ K9zBuyF6vOKNOzNdbCihnoyx2wWJZHetanVwGf5oAEDP/odSsNkKqGE0VZ6acyXBpmK8 QWqC15PbIGfsCyUUf8Uf5RLUSjBUU2PkSu2hFw9Vi/PpN4i2JxBV6qImrifZ4WTvJ1gY DBzQCHkvv+venX2K2xR6Zcqk5geshepvgXqvEfYSGNqQSkrPnQOfGeOwiw7oCrBY3K+Z CpDg==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779811428; x=1780416228; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=aPmXfRnZsF6YjZAZtu+X3RWzn2iAMkkP10VxjHyn+7A=; b=L4WozMUyTcTuhbcqLOrsOkzXO2pDzk88ZNVkCz6Ory2pOeEIdUDirCQ3CuvUg6/tOU mulhhjDYrEg6kAvQtEo1blqyHhHCSRvnZLGl521HVP5xt+w97FZBQuoNOg1VlddB88dp a6G+NQyAP7gAWlmUOk3Nn+VRJDiZ1FgmePLIoVvyVlpalLfK8956kxvgqf1WuuEC9Itg Qtuf6yg/4P0mOKhYb5C4V2BRaKF+uTGD83bMEDf0QUT3iGwx7eIzUoI2CQaLVEcJBG1o qythzPZVznS0/J+8L6N9VqDVU4uMRCHn8uZ7ikuQG8U8qasMYSqKBYv3Oqk32OBjzur7 fZuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779811428; x=1780416228; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=aPmXfRnZsF6YjZAZtu+X3RWzn2iAMkkP10VxjHyn+7A=; b=EtgQn8eJeEdit1mLtPPnlLGEOquCINfOPvVTPSWWaSP0X4H+aFqRSSVwlh+NtH70Oy upannJsZESd7l9f4WrMHRgX9PFmNMq9qLiNkRmEvt6W+QI0SWRx9VAYshCPx1Wn5pCmM TB93pAJH8Zk3DVZz9CA/C33MaDEJ9S16m28QDe3an5JW9Jcc2oiUb8s2ItPAo3Q8HjGI kjqEYkHuP02T9cVhFFOkqZ/Y1w8C+GnFldP8Ux3QdREXvBkDxt4lZD1uFgrZKjUzoJZ4 YdRoFNGCAuisGb2dUO50/4jIYSldoot7I8bmpsG19ym3+pjUCIYDVZiApEHbZoahh7wR zCeg== X-Forwarded-Encrypted: i=1; AFNElJ/CQ2sGvMAH0vK3sVJjDGuiugZi63+v5YFy8UVjwjojXnY72s5poH9CWkNr9I5AREcDKTBjOjSoHI73e7qz@lists.postgresql.org X-Gm-Message-State: AOJu0Yy1udLPBeONXDO/OBi/iph28labmczdIYCmG3uaEJyATK+agoze rYETypTp26ThBjFFg0+Hf+Gw23+0Dxmt5CxqawpLZQG6sgE1EnlcHCnfXjjLwrhr78bjxBNsRCG C/B3VvvYkS7DEwAG7zBn659UI5DL9kPs= X-Gm-Gg: Acq92OHsgvRfzTYKpEiQtFyjhFf3vGhLIz0A2Zqnp5x4dWUknkC+VaBqzU6ClMbsEe3 qWb5K6E1xgkryiV1/xsakXgkIDj6fSdGqKlc5a9CQbz+GtKpoCbvdL2GZgXybIrHHON7NMJ0qnw BEwAWTCLul6abu/GLHLXsDY+qToxC5IHpyGgwlnoTiN07TwC9B87BYfM3oePYN23axwGTSt07H9 a/4zFjqSrVLFsmQC4G9V8ODIGfxevKhiU3jILMGPti2L6uB87SfA5FjqxYdAjLepEqtGT8OBUrf l91qWGkN+XcwXrR32g== X-Received: by 2002:a17:907:b80c:b0:bde:137a:45a8 with SMTP id a640c23a62f3a-bde137a477fmr722603066b.39.1779811427398; Tue, 26 May 2026 09:03:47 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Mats Kindahl Date: Tue, 26 May 2026 18:03:32 +0200 X-Gm-Features: AVHnY4LYbBghdN8Hp47oqCnpda4mws54eTJQPpD76LH1hnGgXk0UebRxgCuCXn4 Message-ID: Subject: Re: pg_rewind does not rewind diverging timelines To: Japin Li Cc: surya poondla , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000e5fcc00652baa346" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000e5fcc00652baa346 Content-Type: multipart/alternative; boundary="000000000000e5fcbf0652baa344" --000000000000e5fcbf0652baa344 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Japin, Thanks for reviewing the patch. On Tue, May 26, 2026 at 8:56=E2=80=AFAM Japin Li wrot= e: > > Hi, Mats > > Thanks for updating the patch. > > On Mon, 25 May 2026 at 20:59, Mats Kindahl wrote= : > > Hi Japin, > > > > On Mon, May 25, 2026 at 7:21=E2=80=AFAM Japin Li = wrote: > > > > Hi, Mats > > > > On Sun, 24 May 2026 at 20:30, Mats Kindahl > wrote: > > > On Fri, May 22, 2026 at 12:09=E2=80=AFAM surya poondla < > suryapoondla4@gmail.com> wrote: > > > > > > Hi Mats, > > > > > > Thanks for picking this up -- the scenario is a real one and I thin= k > the UUID-tagging approach is a clean way to > > > solve it. v2 applies and builds without trouble, and the core > algorithm reads well to me. > > > I have a handful of observations that I'd love your thoughts. > > > > > > Hi Surya, > > > > > > Thank you for the review. It is a quite rare scenario, but it is rea= l > and the fix is simple. > > > > > > Regarding Correctness I have the below thoughts > > > > > > 1. UUIDv7 timestamp epoch. > > > In StartupXLOG(): > > > TimestampTz now =3D GetCurrentTimestamp(); > > > generate_uuidv7_r(&uuid_buf, (uint64)(now / 1000), > > > (uint32)(now % 1000) * 1000); > > > > > > I think there might be a small mismatch here: GetCurrentTimestamp() > returns microseconds since the Postgres epoch > > > (2000-01-01), > > > whereas generate_uuidv7_r describes its first argument as > milliseconds since the Unix epoch. > > > As written that 30-year offset would land in the UUID's timestamp > field, so the resulting UUID wouldn't be a > > > conformant UUIDv7 and wouldn't > > > time-order against UUIDv7s generated through the SQL functions. > > > > > > > > > > > > Uniqueness is preserved either way, so the rewind logic still works > as intended but it seemed worth flagging. > > > > > > I see conversion that's used elsewhere as: > > > us =3D ts + (POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) > > > * SECS_PER_DAY * USECS_PER_SEC; > > > > > > Or, since promotion isn't on a hot path, gettimeofday() / time(NULL= ) > directly would also be fine. > > > > > > Yes, the intention was to use a proper timestamp to allow debugging > servers if necessary. Switched to gettimeofday > > () and > > > used 0 for sub-ms since this is not going to be critical. (We could > use ns here as well, but that would only solve > > a race > > > if you have two servers being promoted in the same ms, which I find > unlikely, and there is a random number added > > for that > > > situation.) > > > > > > 2. EOR-record path, the intent is unclear. > > > > > > The comment above generate_uuidv7_r() at says: > > > > > > "The same UUID is written into the history file and later into the > XLOG_END_OF_RECOVERY record so that pg_rewind > > can > > > distinguish two servers..." > > > > > > But from what I can see only the history-file part actually lands. > > > xl_end_of_recovery is unchanged, CreateEndOfRecoveryRecord() doesn'= t > add the UUID, and XLogCtl->ThisTimeLineUUID > > is > > > written under info_lck without a > > > reader (I couldn't grep it). > > > > > > The xlog_redo() memset() + Min(rec_len, sizeof(...)) change reads > like preparation for an EOR-struct extension > > that > > > ended up not being part of the patch. > > > > > > Was the EOR-record piece something you intended to keep for a > follow-up, or has it been superseded by the > > > history-file approach? > > > > > > No, the EOR changes are not needed for the promotion, contrary to > what I originally thought. Cleaned up the comment > > and > > > the code and removed all traces of changes to the EOR (I hope). > > > > > > > > > > > > 3. Malformed UUID handling in readTimeLineHistory(). > > > > > > The optional field-4 path is: > > > > > > if (nfields =3D=3D 4 && strlen(uuid_str) =3D=3D UUID_STR_L= EN) > > > { > > > Datum datum =3D DirectFunctionCall1(uuid_in, > > > > CStringGetDatum(uuid_str)); > > > ... > > > } > > > > > > uuid_in() raises ereport(ERROR) on a malformed input, while the > surrounding syntax-error paths in > > readTimeLineHistory > > > () use FATAL deliberately. > > > In practice an ERROR during startup ends up being fatal too, so thi= s > isn't strictly a bug but it would be nicer to > > > stay consistent. > > > > > > Agree. I added code to capture the error and raise a FATAL instead > (with the error message from the uuid_in, in > > case it > > > is modified it makes sense to show this). > > > > > > Regarding the Tests I have the following thoughts > > > > > > The two new cases are nice, a few extensions that I think would > strengthen them: > > > 1. A mixed-version case where one side has a zero UUID. That's the > path we're claiming is graceful, but nothing > > > currently exercises it > > > > > > Yes, that should work regardless of whether the source or the target > has the zero UUID. > > > > > > I realized one thing: if two timelines have identical TLI but one ha= s > zero UUID and one has not, it seems they > > could not > > > come from the same promotion (one promotion happened on an old serve= r > and the other one on a new server), that is, > > they > > > should be treated as different. Does that make sense? I made the > necessary changes in the attached patches for > > testing. > > > Please have a look. > > > > > > 2. A deeper-divergence case (e.g. TLI1->2->3 vs TLI1->2->3') so tha= t > findCommonAncestorTimeline's loop walks past > > > matching entries > > > before hitting the mismatch. The 0002 test puts the divergence > at depth 1. > > > > > > I was unsure if this test was necessary or interesting, hence a > separate commit. Since you thought it was useful, > > it's > > > now rolled into the patch and I extended the tests with the scenario= s > you suggested. > > > > > > I also did some refactorings of the tests to avoid duplication. More > below. > > > > > > 3. A small assertion against the on-disk 00000002.history contents, > to pin down the file format. > > > 4. On 0002 the dependency on restore_command pointing at node_x's > pg_wal is the kind of thing that tends to break > > > under > > > environment changes. A CHECKPOINT on node_x before the backup, > or wal_keep_size as in 0001, would let the > > test > > > stand on its own. > > > > > > Good point. > > > > > > I refactored the code to avoid some duplication and make the test > flow self-explanatory and as part of that I set > > the > > > wal_keep_size for all nodes. > > > > > > In the process I noticed that many of the functions in RewindTest.pm > do the same job as the primitives I wrote, but > > have > > > hard-coded variable names. I could rewrite them to take parameters, > but that would be quite a big patch to add > > additional > > > changes to each call site, so I did not do that and rather added > small wrappers specific for the tests in > > > 005_same_timeline.pl=E2=9A=A0=EF=B8=8F=E2=9A=A0=EF=B8=8F. > > > > > > Attached a new version of the now single patch. > > > > > > I'm happy to keep reviewing/contributing, thanks again for working > on it. > > > > > > Thank you for reviewing it. > > > > Thank you for your work. I have one comment. > > > > + a =3D &tlh->source[tlh->sourceNentries - 2].tluuid; > > + b =3D &tlh->target[tlh->targetNentries - 2].tluuid; > > + > > + if (memcmp(a, &zero, UUID_LEN) =3D=3D 0 && memcmp(b, &zero, > UUID_LEN) =3D=3D 0) > > + return true; > > + > > + return memcmp(a, b, UUID_LEN) =3D=3D 0; > > > > Since we already have matchingTimelineUUID(), the above code can be > simplified > > using it. > > > > Thank you for the review. I switched to using the matchingTimelineUUID(= ) > for this part of the code and made some other > > minor improvements as well. > > Here are some comments on v4. > > 1. > +/* > + * Timeline histories for both clusters, populated by timelines_match(). > + */ > > I don't see a timelines_match() function. Does this refer to > matchAndFetchTimelines()? > Correct. Updated. > > 2. > +typedef struct TimelineHistoriesData > +{ > + TimeLineHistoryEntry *source, > + *target; > + int sourceNentries, > + targetNentries; > +} TimelineHistoriesData; > > I'd prefer to use TimeLineHistoriesData to stay consistent with > TimeLineHistoryEntry. Anyway I'm not instant on it. > Makes sense to be consistent. Updated. > > 3. > +typedef TimelineHistoriesData * TimelineHistories; > > The space between * and TimelineHistories is unnecessary =E2=80=94 see > StringInfoData and other typedefs. > My mistake. FIxed. > 4. > +# node_x and node_b both start from the same TLI 1 baseline. > +my ($node_x, $node_b2) =3D > + setup_standbys_from_origin($node_origin2, 'node_x', 'node_b2'); > > There appears to be a typo in the comment. The node_b should be node_b2. > Right. Fixed. > > > Everything else looks good. Thank you again for updating the patch! > Thank you again for reviewing the patch. :) Attached a new version of the patch with the changes you suggested. --=20 Best wishes, Mats Kindahl, Multigres Developer, Supabase --000000000000e5fcbf0652baa344 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Japin,

Thanks for reviewi= ng the patch.

On Tue, May 26, 2026 at 8:56= =E2=80=AFAM Japin Li <japinli@hot= mail.com> wrote:

Hi, Mats

Thanks for updating the patch.

On Mon, 25 May 2026 at 20:59, Mats Kindahl <mats.kindahl@gmail.com> wrote:
> Hi Japin,
>
> On Mon, May 25, 2026 at 7:21=E2=80=AFAM Japin Li <japinli@hotmail.com> wrote:<= br> >
>=C2=A0 Hi, Mats
>
>=C2=A0 On Sun, 24 May 2026 at 20:30, Mats Kindahl <mats.kindahl@gmail.com> w= rote:
>=C2=A0 > On Fri, May 22, 2026 at 12:09=E2=80=AFAM surya poondla <= suryapoondla4@= gmail.com> wrote:
>=C2=A0 >
>=C2=A0 >=C2=A0 Hi Mats,
>=C2=A0 >
>=C2=A0 >=C2=A0 Thanks for picking this up -- the scenario is a real = one and I think the UUID-tagging approach is a clean way to
>=C2=A0 >=C2=A0 solve it. v2 applies and builds without trouble, and = the core algorithm reads well to me.
>=C2=A0 >=C2=A0 I have a handful of observations that I'd love yo= ur thoughts.
>=C2=A0 >
>=C2=A0 > Hi Surya,
>=C2=A0 >
>=C2=A0 > Thank you for the review. It is a quite rare scenario, but = it is real and the fix is simple.
>=C2=A0 >=C2=A0
>=C2=A0 >=C2=A0 Regarding Correctness I have the below thoughts
>=C2=A0 >
>=C2=A0 >=C2=A0 1. UUIDv7 timestamp epoch.
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0In StartupXLOG():
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0TimestampTz now =3D= GetCurrentTimestamp();
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0generate_uuidv7_r(&= amp;uuid_buf, (uint64)(now / 1000),
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 (uint32)(now % 1000) * 1000);
>=C2=A0 >
>=C2=A0 >=C2=A0 I think there might be a small mismatch here: GetCurr= entTimestamp() returns microseconds since the Postgres epoch
>=C2=A0 >=C2=A0 (2000-01-01),
>=C2=A0 >=C2=A0 whereas generate_uuidv7_r describes its first argumen= t as milliseconds since the Unix epoch.
>=C2=A0 >=C2=A0 As written that 30-year offset would land in the UUID= 's timestamp field, so the resulting UUID wouldn't be a
>=C2=A0 >=C2=A0 conformant UUIDv7 and wouldn't
>=C2=A0 >=C2=A0 time-order against UUIDv7s generated through the SQL = functions.
>=C2=A0 >
>=C2=A0 >=C2=A0
>=C2=A0 >=C2=A0
>=C2=A0 >=C2=A0 Uniqueness is preserved either way, so the rewind log= ic still works as intended but it seemed worth flagging.
>=C2=A0 >
>=C2=A0 >=C2=A0 I see conversion that's used elsewhere as:
>=C2=A0 >=C2=A0 us =3D ts + (POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE)=
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0* SECS_PER_DAY * USECS_PER_SEC;
>=C2=A0 >
>=C2=A0 >=C2=A0 Or, since promotion isn't on a hot path, gettimeo= fday() / time(NULL) directly would also be fine.
>=C2=A0 >
>=C2=A0 > Yes, the intention was to use a proper timestamp to allow d= ebugging servers if necessary. Switched to gettimeofday
>=C2=A0 () and
>=C2=A0 > used 0 for sub-ms since this is not going to be critical. (= We could use ns here as well, but that would only solve
>=C2=A0 a race
>=C2=A0 > if you have two servers being promoted in the same ms, whic= h I find unlikely, and there is a random number added
>=C2=A0 for that
>=C2=A0 > situation.)
>=C2=A0 >=C2=A0
>=C2=A0 >=C2=A0 2. EOR-record path, the intent is unclear.
>=C2=A0 >
>=C2=A0 >=C2=A0 The comment above generate_uuidv7_r() at says:
>=C2=A0 >
>=C2=A0 >=C2=A0 "The same UUID is written into the history file = and later into the XLOG_END_OF_RECOVERY record so that pg_rewind
>=C2=A0 can
>=C2=A0 >=C2=A0 distinguish two servers..."
>=C2=A0 >
>=C2=A0 >=C2=A0 But from what I can see only the history-file part ac= tually lands.
>=C2=A0 >=C2=A0 xl_end_of_recovery is unchanged, CreateEndOfRecoveryR= ecord() doesn't add the UUID, and XLogCtl->ThisTimeLineUUID
>=C2=A0 is
>=C2=A0 >=C2=A0 written under info_lck without a
>=C2=A0 >=C2=A0 reader (I couldn't grep it).
>=C2=A0 >
>=C2=A0 >=C2=A0 The xlog_redo() memset() + Min(rec_len, sizeof(...)) = change reads like preparation for an EOR-struct extension
>=C2=A0 that
>=C2=A0 >=C2=A0 ended up not being part of the patch.
>=C2=A0 >
>=C2=A0 >=C2=A0 Was the EOR-record piece something you intended to ke= ep for a follow-up, or has it been superseded by the
>=C2=A0 >=C2=A0 history-file approach?
>=C2=A0 >
>=C2=A0 > No, the EOR changes are not needed for the promotion, contr= ary to what I originally thought. Cleaned up the comment
>=C2=A0 and
>=C2=A0 > the code and removed all traces of changes to the EOR (I ho= pe).
>=C2=A0 >=C2=A0
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0
>=C2=A0 >
>=C2=A0 >=C2=A0 3. Malformed UUID handling in readTimeLineHistory().<= br> >=C2=A0 >
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0The optional field-4 path is:
>=C2=A0 >
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (nfields =3D=3D = 4 && strlen(uuid_str) =3D=3D UUID_STR_LEN)
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Datum= datum =3D DirectFunctionCall1(uuid_in,
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0CStringGetDatum(uuid_str));
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0... >=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>=C2=A0 >
>=C2=A0 >=C2=A0 uuid_in() raises ereport(ERROR) on a malformed input,= while the surrounding syntax-error paths in
>=C2=A0 readTimeLineHistory
>=C2=A0 >=C2=A0 () use FATAL deliberately.
>=C2=A0 >=C2=A0 In practice an ERROR during startup ends up being fat= al too, so this isn't strictly a bug but it would be nicer to
>=C2=A0 >=C2=A0 stay consistent.
>=C2=A0 >
>=C2=A0 > Agree. I added code to capture the error and raise a FATAL = instead (with the error message from the uuid_in, in
>=C2=A0 case it
>=C2=A0 > is modified it makes sense to show this).
>=C2=A0 >=C2=A0
>=C2=A0 >=C2=A0 Regarding the Tests I have the following thoughts
>=C2=A0 >
>=C2=A0 >=C2=A0 The two new cases are nice, a few extensions that I t= hink would strengthen them:
>=C2=A0 >=C2=A0 1. A mixed-version case where one side has a zero UUI= D. That's the path we're claiming is graceful, but nothing
>=C2=A0 >=C2=A0 currently exercises it
>=C2=A0 >
>=C2=A0 > Yes, that should work regardless of whether the source or t= he target has the zero UUID.
>=C2=A0 >
>=C2=A0 > I realized one thing: if two timelines have identical TLI b= ut one has zero UUID and one has not, it seems they
>=C2=A0 could not
>=C2=A0 > come from the same promotion (one promotion happened on an = old server and the other one on a new server), that is,
>=C2=A0 they
>=C2=A0 > should be treated as different. Does that make sense? I mad= e the necessary changes in the attached patches for
>=C2=A0 testing.
>=C2=A0 > Please have a look.
>=C2=A0 >=C2=A0
>=C2=A0 >=C2=A0 2. A deeper-divergence case (e.g. TLI1->2->3 vs= TLI1->2->3') so that findCommonAncestorTimeline's loop walks= past
>=C2=A0 >=C2=A0 matching entries
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0before hitting the mismatch. The = 0002 test puts the divergence at depth 1.
>=C2=A0 >
>=C2=A0 > I was unsure if this test was necessary or interesting, hen= ce a separate commit. Since you thought it was useful,
>=C2=A0 it's
>=C2=A0 > now rolled into the patch and I extended the tests with the= scenarios you suggested.
>=C2=A0 >
>=C2=A0 > I also did some refactorings of the tests to avoid duplicat= ion. More below.
>=C2=A0 >=C2=A0
>=C2=A0 >=C2=A0 3. A small assertion against the on-disk 00000002.his= tory contents, to pin down the file format.
>=C2=A0 >=C2=A0 4. On 0002 the dependency on restore_command pointing= at node_x's pg_wal is the kind of thing that tends to break
>=C2=A0 >=C2=A0 under
>=C2=A0 >=C2=A0 =C2=A0 =C2=A0 =C2=A0environment changes. A CHECKPOINT= on node_x before the backup, or wal_keep_size as in 0001, would let the >=C2=A0 test
>=C2=A0 >=C2=A0 stand on its own.
>=C2=A0 >
>=C2=A0 > Good point.
>=C2=A0 >
>=C2=A0 > I refactored the code to avoid some duplication and make th= e test flow self-explanatory and as part of that I set
>=C2=A0 the
>=C2=A0 > wal_keep_size for all nodes.
>=C2=A0 >
>=C2=A0 > In the process I noticed that many of the functions in Rewi= ndTest.pm do the same job as the primitives I wrote, but
>=C2=A0 have
>=C2=A0 > hard-coded variable names. I could rewrite them to take par= ameters, but that would be quite a big patch to add
>=C2=A0 additional
>=C2=A0 > changes to each call site, so I did not do that and rather = added small wrappers specific for the tests in
>=C2=A0 > 005_same_timeline.pl=E2=9A=A0=EF=B8=8F=E2=9A=A0=EF=B8= =8F.
>=C2=A0 >=C2=A0
>=C2=A0 > Attached a new version of the now single patch.
>=C2=A0 >
>=C2=A0 >=C2=A0 I'm happy to keep reviewing/contributing, thanks = again for working on it.
>=C2=A0 >
>=C2=A0 > Thank you for reviewing it.
>
>=C2=A0 Thank you for your work.=C2=A0 I have one comment.
>
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0a =3D &tlh->source[tlh->so= urceNentries - 2].tluuid;
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0b =3D &tlh->target[tlh->ta= rgetNentries - 2].tluuid;
>=C2=A0 +
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0if (memcmp(a, &zero, UUID_LEN) = =3D=3D 0 && memcmp(b, &zero, UUID_LEN) =3D=3D 0)
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return t= rue;
>=C2=A0 +
>=C2=A0 +=C2=A0 =C2=A0 =C2=A0 =C2=A0return memcmp(a, b, UUID_LEN) =3D=3D= 0;
>
>=C2=A0 Since we already have matchingTimelineUUID(), the above code can= be simplified
>=C2=A0 using it.
>
> Thank you for the review. I switched to using the matchingTimelineUUID= () for this part of the code and made some other
> minor improvements as well.

Here are some comments on v4.

1.
+/*
+ * Timeline histories for both clusters, populated by timelines_match(). + */

I don't see a timelines_match() function.=C2=A0 Does this refer to
matchAndFetchTimelines()?

Correct. Upda= ted.
=C2=A0

3.
+typedef TimelineHistoriesData * TimelineHistories;

The space between * and TimelineHistories is unnecessary =E2=80=94 see
StringInfoData and other typedefs.

My m= istake. FIxed.
=C2=A0
4.
+# node_x and node_b both start from the same TLI 1 baseline.
+my ($node_x, $node_b2) =3D
+=C2=A0 setup_standbys_from_origin($node_origin2, 'node_x', 'no= de_b2');

There appears to be a typo in the comment.=C2=A0 The node_b should be node_= b2.

Right. Fixed.
=C2=A0


Everything else looks good.=C2=A0 Thank you again for updating the patch!

Thank you again for reviewing the patch.= :)

Attached a new version of the patch with the c= hanges you suggested.

--
Best wishes,
Mats Kindahl, Multigres Developer, Supabase
--000000000000e5fcbf0652baa344-- --000000000000e5fcc00652baa346 Content-Type: text/x-patch; charset="US-ASCII"; name="v5.0001-pg_rewind-use-UUIDs-to-detect-independent-same-TLI-p.patch" Content-Disposition: attachment; filename="v5.0001-pg_rewind-use-UUIDs-to-detect-independent-same-TLI-p.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpmtrd6d0 RnJvbSA0MjgyNmUyMmEyMWY4ODE4ZDM2MDJmYTMxYmI4YWNjMzExYTA5MjliIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRzIEtpbmRhaGwgPG1hdHNAa2luZGFobC5uZXQ+CkRhdGU6 IFNhdCwgMjMgTWF5IDIwMjYgMTY6MDk6NDQgKzAyMDAKU3ViamVjdDogcGdfcmV3aW5kOiB1c2Ug VVVJRHMgdG8gZGV0ZWN0IGluZGVwZW5kZW50IHNhbWUtVExJIHByb21vdGlvbnMKClR3byBQb3N0 Z3JlU1FMIHN0YW5kYnlzIGNhbiBpbmRlcGVuZGVudGx5IHByb21vdGUgdG8gdGhlIHNhbWUgdGlt ZWxpbmUKSUQgaWYgdGhlaXIgcHJpbWFyeSBzdG9wcGVkIGJlZm9yZSBlaXRoZXIgaGFkIGEgY2hh bmNlIHRvIHByb21vdGUuICBJbgp0aGF0IHNpdHVhdGlvbiBib3RoIGNsdXN0ZXJzIHNoYXJlIGEg dGltZWxpbmUgaGlzdG9yeSBwcmVmaXggdGhhdCBsb29rcwppZGVudGljYWwgdG8gcGdfcmV3aW5k OiBzYW1lIFRMSSBudW1iZXJzIGFuZCBzYW1lIGJlZ2luL2VuZCBMU05zLiAgVGhlCmV4aXN0aW5n IHNhbWUtVExJIHNob3J0Y3V0IHRoZXJlZm9yZSB0cmVhdGVkIHRoZSBzb3VyY2UgYXMgYSB2YWxp ZApyZXdpbmQgdGFyZ2V0IGFuZCBza2lwcGVkIHRoZSByZXdpbmQgZW50aXJlbHksIGxlYXZpbmcg dGhlIHRhcmdldCdzCmRpdmVyZ2VkIFdBTCBpbnRhY3QuCgpGaXggdGhpcyBieSBlbWJlZGRpbmcg YSBVVUlEdjcgdmFsdWUgaW4gZXZlcnkgdGltZWxpbmUgaGlzdG9yeSBmaWxlCmVudHJ5IGF0IHBy b21vdGlvbiB0aW1lLiAgRWFjaCBwcm9tb3Rpb24gZ2VuZXJhdGVzIGEgZnJlc2ggVVVJRCwgc28g dHdvCmluZGVwZW5kZW50IHByb21vdGlvbnMgdG8gdGhlIHNhbWUgVExJIHdpbGwgY2FycnkgZGlm ZmVyZW50IFVVSURzIGV2ZW4KdGhvdWdoIHRoZSBUTEkgbnVtYmVyIGFuZCBiZWdpbiBMU04gYXJl IGlkZW50aWNhbC4KCldoZW4gbG9hZGluZyB0aGUgdGltZWxpbmUgaGlzdG9yeSwgcGdfcmV3aW5k IHVzZXMgdGhlc2UgVVVJRHMgaW4gdHdvCnBsYWNlczoKCjEuIGZpbmRDb21tb25BbmNlc3RvclRp bWVsaW5lIGNoZWNrcyB0aGF0IHRoZSBUTEkgYW5kIFVVSUQgaW4gZWFjaCBlbnRyeQogICBtYXRj aC4gIEEgbWlzbWF0Y2ggc2lnbmFscyBpbmRlcGVuZGVudCBwcm9tb3Rpb25zIGFuZCB0aGUgc2Vh cmNoCiAgIGNvbnRpbnVlcyB0byBlYXJsaWVyIGVudHJpZXMgdG8gZmluZCB0aGUgdHJ1ZSBjb21t b24gYW5jZXN0b3IuCgoyLiBUaGUgc2FtZS1UTEkgc2hvcnRjdXQgKHNvdXJjZSBhbmQgdGFyZ2V0 IG9uIHRoZSBzYW1lIGN1cnJlbnQgVExJKQogICBjb21wYXJlcyB0aGUgVVVJRCBzdG9yZWQgaW4g dGhlIGxhc3QgY29tcGxldGVkIGhpc3RvcnkgZW50cnkgYW5kIGEKICAgbWlzbWF0Y2ggZm9yY2Vz IGEgZnVsbCByZXdpbmQgaW5zdGVhZCBvZiBhIG5vLW9wLgoKVVVJRHMgYXJlIHplcm8gZm9yIGNs dXN0ZXJzIHRoYXQgcHJlZGF0ZSB0aGlzIGNoYW5nZSwgYW5kIHRoZSBjb21wYXJpc29uCmZ1bmN0 aW9uIHRyZWF0cyBhIHplcm8gVVVJRCBvbiBlaXRoZXIgc2lkZSBhcyBkaWZmZXJlbnQgZnJvbSBh IFVVSUQKc2luY2UgdGhhdCBwcm9tb3Rpb24gaGFzIHRvIGJlIGZyb20gYSBkaWZmZXJlbnQgc2Vy dmVyIChpdCBoYWQgYQpwcmUtY2hhbmdlIHZlcnNpb24gc2VydmVyIHRoYXQgd2FzIHByb21vdGVk LCBzbyBpdCBjYW5ub3QgYmUgdGhlIHNhbWUgYXMKYSBwb3N0LWNoYW5nZSB2ZXJzaW9uIHNlcnZl ciB0aGF0IHdhcyBwcm9tb3RlZCkuCgpUd28gbmV3IHRlc3RzIGluIHQvMDA1X3NhbWVfdGltZWxp bmUucGwgY292ZXIgYm90aCBkZXRlY3Rpb24gcGF0aHMuCgpUaGUgZmlyc3QgY292ZXJzIHRoZSBz YW1lLVRMSSBzaG9ydGN1dDogdHdvIHN0YW5kYnlzIGluZGVwZW5kZW50bHkKcHJvbW90ZSB0byBU TEkyIGFuZCBUTEkyJywgZWFjaCB3aXRoIGEgZGlzdGluY3QgVVVJRC4KClRoZSBzZWNvbmQgY292 ZXJzIHRoZSBhbmNlc3RvciBzZWFyY2g6IHRoZSB0YXJnZXQgZ29lcyB0aHJvdWdoIFRMSTEgLT4K VExJMiAtPiBUTEkzIHdoaWxlIHRoZSBzb3VyY2UgaW5kZXBlbmRlbnRseSBwcm9tb3RlZCBzbyB0 aGF0IGl0IGhhcyBhCnRpbWVsaW5lIHdpdGggVExJMSAtPiBUTEkyJyAtPiBUTEkzJy4gVGhlIHRl c3QgZW5zdXJlcyB0aGF0CmZpbmRDb21tb25BbmNlc3RvclRpbWVsaW5lIGJhY2tzIHVwIHRvIFRM STEgYXMgdGhlIHRydWUgY29tbW9uIGFuY2VzdG9yCnJhdGhlciB0aGFuIGFjY2VwdGluZyB0aGUg bnVtZXJpY2FsbHkgbWF0Y2hpbmcgVExJMiBlbnRyeS4KLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3Mv dHJhbnNhbS90aW1lbGluZS5jICAgIHwgIDc5ICsrKystCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJh bnNhbS94bG9nLmMgICAgICAgIHwgIDE1ICsKIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC91dWlkLmMg ICAgICAgICAgICAgfCAgMTUgKy0KIHNyYy9iaW4vcGdfcmV3aW5kL3BnX3Jld2luZC5jICAgICAg ICAgICAgfCAxMDQgKysrKysrLQogc3JjL2Jpbi9wZ19yZXdpbmQvdC8wMDVfc2FtZV90aW1lbGlu ZS5wbCB8IDM1MyArKysrKysrKysrKysrKysrKysrKysrKwogc3JjL2Jpbi9wZ19yZXdpbmQvdGlt ZWxpbmUuYyAgICAgICAgICAgICB8ICA0NyArKy0KIHNyYy9pbmNsdWRlL2FjY2Vzcy90aW1lbGlu ZS5oICAgICAgICAgICAgfCAgIDUgKy0KIHNyYy9pbmNsdWRlL2FjY2Vzcy94bG9nX2ludGVybmFs LmggICAgICAgfCAgIDEgKwogc3JjL2luY2x1ZGUvdXRpbHMvdXVpZC5oICAgICAgICAgICAgICAg ICB8ICAxMCArLQogOSBmaWxlcyBjaGFuZ2VkLCA2MDYgaW5zZXJ0aW9ucygrKSwgMjMgZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vdGltZWxpbmUu YyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3RpbWVsaW5lLmMKaW5kZXggNjhlNWY2OTJk MjYuLmRmMTYxZGNjMGQ1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS90 aW1lbGluZS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3RpbWVsaW5lLmMKQEAg LTQyLDYgKzQyLDggQEAKICNpbmNsdWRlICJwZ3N0YXQuaCIKICNpbmNsdWRlICJzdG9yYWdlL2Zk LmgiCiAjaW5jbHVkZSAidXRpbHMvd2FpdF9ldmVudC5oIgorI2luY2x1ZGUgInV0aWxzL2ZtZ3Jw cm90b3MuaCIKKyNpbmNsdWRlICJ1dGlscy91dWlkLmgiCiAKIC8qCiAgKiBDb3BpZXMgYWxsIHRp bWVsaW5lIGhpc3RvcnkgZmlsZXMgd2l0aCBpZCdzIGJldHdlZW4gJ2JlZ2luJyBhbmQgJ2VuZCcK QEAgLTExMCw4ICsxMTIsMTIgQEAgcmVhZFRpbWVMaW5lSGlzdG9yeShUaW1lTGluZUlEIHRhcmdl dFRMSSkKIAkJCWVyZXBvcnQoRkFUQUwsCiAJCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2Vzcygp LAogCQkJCQkgZXJybXNnKCJjb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIjogJW0iLCBwYXRoKSkp OwotCQkvKiBOb3QgdGhlcmUsIHNvIGFzc3VtZSBubyBwYXJlbnRzICovCi0JCWVudHJ5ID0gcGFs bG9jX29iamVjdChUaW1lTGluZUhpc3RvcnlFbnRyeSk7CisKKwkJLyoKKwkJICogTm90IHRoZXJl LCBzbyBhc3N1bWUgbm8gcGFyZW50cy4gV2UgdXNlIHBhbGxvYzBfb2JqZWN0IHRvIGVuc3VyZQor CQkgKiB0aGF0IHRsdXVpZCBpcyBhbGwtemVyby4KKwkJICovCisJCWVudHJ5ID0gcGFsbG9jMF9v YmplY3QoVGltZUxpbmVIaXN0b3J5RW50cnkpOwogCQllbnRyeS0+dGxpID0gdGFyZ2V0VExJOwog CQllbnRyeS0+YmVnaW4gPSBlbnRyeS0+ZW5kID0gSW52YWxpZFhMb2dSZWNQdHI7CiAJCXJldHVy biBsaXN0X21ha2UxKGVudHJ5KTsKQEAgLTEyNSw2ICsxMzEsNyBAQCByZWFkVGltZUxpbmVIaXN0 b3J5KFRpbWVMaW5lSUQgdGFyZ2V0VExJKQogCXByZXZlbmQgPSBJbnZhbGlkWExvZ1JlY1B0cjsK IAlmb3IgKDs7KQogCXsKKwkJY2hhcgkJdXVpZF9zdHJbVVVJRF9TVFJfTEVOICsgMV0gPSB7MH07 CiAJCWNoYXIJCWZsaW5lW01BWFBHUEFUSF07CiAJCWNoYXIJICAgKnJlczsKIAkJY2hhcgkgICAq cHRyOwpAQCAtMTU1LDcgKzE2Miw4IEBAIHJlYWRUaW1lTGluZUhpc3RvcnkoVGltZUxpbmVJRCB0 YXJnZXRUTEkpCiAJCWlmICgqcHRyID09ICdcMCcgfHwgKnB0ciA9PSAnIycpCiAJCQljb250aW51 ZTsKIAotCQluZmllbGRzID0gc3NjYW5mKGZsaW5lLCAiJXVcdCVYLyUwOFgiLCAmdGxpLCAmc3dp dGNocG9pbnRfaGksICZzd2l0Y2hwb2ludF9sbyk7CisJCW5maWVsZHMgPQorCQkJc3NjYW5mKGZs aW5lLCAiJXVcdCVYLyUwOFhcdCUzNnMiLCAmdGxpLCAmc3dpdGNocG9pbnRfaGksICZzd2l0Y2hw b2ludF9sbywgdXVpZF9zdHIpOwogCiAJCWlmIChuZmllbGRzIDwgMSkKIAkJewpAQCAtMTY0LDcg KzE3Miw3IEBAIHJlYWRUaW1lTGluZUhpc3RvcnkoVGltZUxpbmVJRCB0YXJnZXRUTEkpCiAJCQkJ CShlcnJtc2coInN5bnRheCBlcnJvciBpbiBoaXN0b3J5IGZpbGU6ICVzIiwgZmxpbmUpLAogCQkJ CQkgZXJyaGludCgiRXhwZWN0ZWQgYSBudW1lcmljIHRpbWVsaW5lIElELiIpKSk7CiAJCX0KLQkJ aWYgKG5maWVsZHMgIT0gMykKKwkJaWYgKG5maWVsZHMgPCAzKQogCQkJZXJlcG9ydChGQVRBTCwK IAkJCQkJKGVycm1zZygic3ludGF4IGVycm9yIGluIGhpc3RvcnkgZmlsZTogJXMiLCBmbGluZSks CiAJCQkJCSBlcnJoaW50KCJFeHBlY3RlZCBhIHdyaXRlLWFoZWFkIGxvZyBzd2l0Y2hwb2ludCBs b2NhdGlvbi4iKSkpOwpAQCAtMTc2LDEyICsxODQsNDUgQEAgcmVhZFRpbWVMaW5lSGlzdG9yeShU aW1lTGluZUlEIHRhcmdldFRMSSkKIAogCQlsYXN0dGxpID0gdGxpOwogCi0JCWVudHJ5ID0gcGFs bG9jX29iamVjdChUaW1lTGluZUhpc3RvcnlFbnRyeSk7CisJCS8qCisJCSAqIFdlIHVzZSBwYWxs b2MwX29iamVjdCB0byBlbnN1cmUgdGhhdCB0bHV1aWQgaXMgYWxsLXplcm8sIHdoaWNoIGlzCisJ CSAqIGltcG9ydGFudCBmb3IgcGdfcmV3aW5kIHRvIGRldGVjdCB3aGV0aGVyIHRoZSBoaXN0b3J5 IGZpbGUgaXMKKwkJICogbWlzc2luZyBvciBub3QuCisJCSAqLworCQllbnRyeSA9IHBhbGxvYzBf b2JqZWN0KFRpbWVMaW5lSGlzdG9yeUVudHJ5KTsKIAkJZW50cnktPnRsaSA9IHRsaTsKIAkJZW50 cnktPmJlZ2luID0gcHJldmVuZDsKIAkJZW50cnktPmVuZCA9ICgodWludDY0KSAoc3dpdGNocG9p bnRfaGkpKSA8PCAzMiB8ICh1aW50NjQpIHN3aXRjaHBvaW50X2xvOwogCQlwcmV2ZW5kID0gZW50 cnktPmVuZDsKIAorCQkvKgorCQkgKiBQYXJzZSB0aGUgb3B0aW9uYWwgVVVJRCBmaWVsZC4gT2xk IGhpc3RvcnkgZmlsZXMgaGF2ZSB0aGUgcmVhc29uCisJCSAqIHN0cmluZyBpbiBmaWVsZCA0LiBJ dCBpcyBpbiB0aGVvcnkgcG9zc2libGUgdGhhdCB0aGUgcmVhc29uIHN0cmluZworCQkgKiBzdGFy dHMgd2l0aCBhIFVVSUQsIGJ1dCB0aGUgY3VycmVudCB1c2FnZSBkbyBub3Qgc3RvcmUgYSBVVUlE LiBUaGlzCisJCSAqIGFsbG93cyB1cyB0byBzdXBwb3J0IGJvdGggb2xkIGFuZCBuZXcgZm9ybWF0 cyBvZiBoaXN0b3J5IGZpbGVzCisJCSAqIHdpdGhvdXQgYnJlYWtpbmcgY29tcGF0aWJpbGl0eSBi eSBjaGVja2luZyBpZiB0aGUgZmllbGQgY29udGFpbnMgYQorCQkgKiB2YWxpZCBVVUlELgorCQkg Ki8KKwkJaWYgKG5maWVsZHMgPT0gNCAmJiBzdHJsZW4odXVpZF9zdHIpID09IFVVSURfU1RSX0xF TikKKwkJeworCQkJUEdfVFJZKCk7CisJCQl7CisJCQkJRGF0dW0JCWRhdHVtID0gRGlyZWN0RnVu Y3Rpb25DYWxsMSh1dWlkX2luLCBDU3RyaW5nR2V0RGF0dW0odXVpZF9zdHIpKTsKKworCQkJCW1l bWNweSgmZW50cnktPnRsdXVpZCwgRGF0dW1HZXRVVUlEUChkYXR1bSksIHNpemVvZihwZ191dWlk X3QpKTsKKwkJCX0KKwkJCVBHX0NBVENIKCk7CisJCQl7CisJCQkJRXJyb3JEYXRhICAqZWRhdGEg PSBDb3B5RXJyb3JEYXRhKCk7CisKKwkJCQlGbHVzaEVycm9yU3RhdGUoKTsKKwkJCQllcmVwb3J0 KEZBVEFMLAorCQkJCQkJZXJybXNnKCJpbnZhbGlkIFVVSUQgaW4gaGlzdG9yeSBmaWxlIFwiJXNc IiIsIHBhdGgpLAorCQkJCQkJZXJyZGV0YWlsKCIlcyIsIGVkYXRhLT5tZXNzYWdlKSk7CisJCQl9 CisJCQlQR19FTkRfVFJZKCk7CisJCX0KKwogCQkvKiBCdWlsZCBsaXN0IHdpdGggbmV3ZXN0IGl0 ZW0gZmlyc3QgKi8KIAkJcmVzdWx0ID0gbGNvbnMoZW50cnksIHJlc3VsdCk7CiAKQEAgLTE5Nyw5 ICsyMzgsMTEgQEAgcmVhZFRpbWVMaW5lSGlzdG9yeShUaW1lTGluZUlEIHRhcmdldFRMSSkKIAog CS8qCiAJICogQ3JlYXRlIG9uZSBtb3JlIGVudHJ5IGZvciB0aGUgInRpcCIgb2YgdGhlIHRpbWVs aW5lLCB3aGljaCBoYXMgbm8gZW50cnkKLQkgKiBpbiB0aGUgaGlzdG9yeSBmaWxlLgorCSAqIGlu IHRoZSBoaXN0b3J5IGZpbGUuIFdlIHVzZSBwYWxsb2MwX29iamVjdCB0byBlbnN1cmUgdGhhdCB0 bHV1aWQgaXMKKwkgKiBhbGwtemVybywgd2hpY2ggaXMgaW1wb3J0YW50IGZvciBwZ19yZXdpbmQg dG8gZGV0ZWN0IHdoZXRoZXIgdGhlCisJICogaGlzdG9yeSBmaWxlIGlzIG1pc3Npbmcgb3Igbm90 LgogCSAqLwotCWVudHJ5ID0gcGFsbG9jX29iamVjdChUaW1lTGluZUhpc3RvcnlFbnRyeSk7CisJ ZW50cnkgPSBwYWxsb2MwX29iamVjdChUaW1lTGluZUhpc3RvcnlFbnRyeSk7CiAJZW50cnktPnRs aSA9IHRhcmdldFRMSTsKIAllbnRyeS0+YmVnaW4gPSBwcmV2ZW5kOwogCWVudHJ5LT5lbmQgPSBJ bnZhbGlkWExvZ1JlY1B0cjsKQEAgLTI5NCwyMSArMzM3LDMzIEBAIGZpbmROZXdlc3RUaW1lTGlu ZShUaW1lTGluZUlEIHN0YXJ0VExJKQogICoKICAqCW5ld1RMSTogSUQgb2YgdGhlIG5ldyB0aW1l bGluZQogICoJcGFyZW50VExJOiBJRCBvZiBpdHMgaW1tZWRpYXRlIHBhcmVudAorICoJbmV3VExV VUlEOiBVVUlEIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoaXMgcHJvbW90aW9uIGluc3RhbmNlCiAg Kglzd2l0Y2hwb2ludDogV0FMIGxvY2F0aW9uIHdoZXJlIHRoZSBzeXN0ZW0gc3dpdGNoZWQgdG8g dGhlIG5ldyB0aW1lbGluZQogICoJcmVhc29uOiBodW1hbi1yZWFkYWJsZSBleHBsYW5hdGlvbiBv ZiB3aHkgdGhlIHRpbWVsaW5lIHdhcyBzd2l0Y2hlZAogICoKLSAqIEN1cnJlbnRseSB0aGlzIGlz IG9ubHkgdXNlZCBhdCB0aGUgZW5kIHJlY292ZXJ5LCBhbmQgc28gdGhlcmUgYXJlIG5vIGxvY2tp bmcKKyAqIFRoZSBvdXRwdXQgZmlsZSBpcyBuYW1lZCA8bmV3VExJPi5oaXN0b3J5IChlLmcuIDAw MDAwMDAzLmhpc3RvcnkpLiAgSWYgdHdvCisgKiBzZXJ2ZXJzIGluZGVwZW5kZW50bHkgcHJvbW90 ZSB0byB0aGUgc2FtZSB0aW1lbGluZSBJRCwgdGhlaXIgaGlzdG9yeSBmaWxlcworICogc2hhcmUg dGhlIHNhbWUgbmFtZS4gSW4gYSBzaGFyZWQgV0FMIGFyY2hpdmUgdGhlIHNlY29uZCBmaWxlIHRv IGFycml2ZQorICogc2lsZW50bHkgb3ZlcndyaXRlcyB0aGUgZmlyc3QuICBUaGUgbmV3VExVVUlE IHdyaXR0ZW4gaW50byB0aGUgZmlsZSBjb250ZW50CisgKiBsZXRzIHBnX3Jld2luZCBkZXRlY3Qg dGhpcyBjb2xsaXNpb246IGl0IGZldGNoZXMgZWFjaCBzZXJ2ZXIncyBoaXN0b3J5IGZpbGUKKyAq IGRpcmVjdGx5IGZyb20gdGhhdCBzZXJ2ZXIsIGNvbXBhcmVzIHRoZSBVVUlEcyBmb3IgZXZlcnkg c2hhcmVkIFRMSSwgYW5kCisgKiB0cmVhdHMgYSBVVUlEIG1pc21hdGNoIGFzIGV2aWRlbmNlIG9m IGluZGVwZW5kZW50IHByb21vdGlvbiBldmVuIHdoZW4gdGhlCisgKiBUTEkgbnVtYmVycyBhZ3Jl ZS4KKyAqCisgKiBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IHVzZWQgYXQgZW5kIG9mIHJlY292ZXJ5 LCBhbmQgc28gdGhlcmUgYXJlIG5vIGxvY2tpbmcKICAqIGNvbnNpZGVyYXRpb25zLiAgQnV0IHdl IHNob3VsZCBiZSBqdXN0IGFzIHRlbnNlIGFzIFhMb2dGaWxlSW5pdCB0byBhdm9pZAogICogZW1w bGFjaW5nIGEgYm9ndXMgZmlsZS4KICAqLwogdm9pZAogd3JpdGVUaW1lTGluZUhpc3RvcnkoVGlt ZUxpbmVJRCBuZXdUTEksIFRpbWVMaW5lSUQgcGFyZW50VExJLAorCQkJCQkgY29uc3QgcGdfdXVp ZF90ICpuZXdUTFVVSUQsCiAJCQkJCSBYTG9nUmVjUHRyIHN3aXRjaHBvaW50LCBjaGFyICpyZWFz b24pCiB7CiAJY2hhcgkJcGF0aFtNQVhQR1BBVEhdOwogCWNoYXIJCXRtcHBhdGhbTUFYUEdQQVRI XTsKIAljaGFyCQloaXN0Zm5hbWVbTUFYRk5BTUVMRU5dOwogCWNoYXIJCWJ1ZmZlcltCTENLU1pd OworCWNoYXIJICAgKnV1aWRfc3RyOwogCWludAkJCXNyY2ZkOwogCWludAkJCWZkOwogCWludAkJ CW5ieXRlczsKQEAgLTM5OCwxMyArNDUzLDE5IEBAIHdyaXRlVGltZUxpbmVIaXN0b3J5KFRpbWVM aW5lSUQgbmV3VExJLCBUaW1lTGluZUlEIHBhcmVudFRMSSwKIAkgKgogCSAqIElmIHdlIGRpZCBo YXZlIGEgcGFyZW50IGZpbGUsIGluc2VydCBhbiBleHRyYSBuZXdsaW5lIGp1c3QgaW4gY2FzZSB0 aGUKIAkgKiBwYXJlbnQgZmlsZSBmYWlsZWQgdG8gZW5kIHdpdGggb25lLgorCSAqCisJICogRm9y bWF0OiA8cGFyZW50VExJPlx0PHN3aXRjaHBvaW50Plx0PFRoaXNUaW1lTGluZVVVSUQ+XHQ8cmVh c29uPlxuCiAJICovCisJdXVpZF9zdHIgPSBEYXR1bUdldENTdHJpbmcoRGlyZWN0RnVuY3Rpb25D YWxsMSh1dWlkX291dCwgVVVJRFBHZXREYXR1bShuZXdUTFVVSUQpKSk7CisKIAlzbnByaW50Zihi dWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkJICIlcyV1XHQlWC8lMDhYXHQlc1xuIiwKKwkJCSAi JXMldVx0JVgvJTA4WFx0JXNcdCVzXG4iLAogCQkJIChzcmNmZCA8IDApID8gIiIgOiAiXG4iLAog CQkJIHBhcmVudFRMSSwKIAkJCSBMU05fRk9STUFUX0FSR1Moc3dpdGNocG9pbnQpLAorCQkJIHV1 aWRfc3RyLAogCQkJIHJlYXNvbik7CisJcGZyZWUodXVpZF9zdHIpOwogCiAJbmJ5dGVzID0gc3Ry bGVuKGJ1ZmZlcik7CiAJZXJybm8gPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNz L3RyYW5zYW0veGxvZy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jCmluZGV4 IGJlZGRjYjU1MmQ2Li44NzQ4NmVjNmExYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNz L3RyYW5zYW0veGxvZy5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYwpA QCAtOTksNiArOTksNyBAQAogI2luY2x1ZGUgInN0b3JhZ2Uvc3Vic3lzdGVtcy5oIgogI2luY2x1 ZGUgInN0b3JhZ2Uvc3luYy5oIgogI2luY2x1ZGUgInV0aWxzL2d1Y19ob29rcy5oIgorI2luY2x1 ZGUgInV0aWxzL3V1aWQuaCIKICNpbmNsdWRlICJ1dGlscy9ndWNfdGFibGVzLmgiCiAjaW5jbHVk ZSAidXRpbHMvaW5qZWN0aW9uX3BvaW50LmgiCiAjaW5jbHVkZSAidXRpbHMvcGdzdGF0X2ludGVy bmFsLmgiCkBAIC02Mzc4LDYgKzYzNzksOSBAQCBTdGFydHVwWExPRyh2b2lkKQogCW5ld1RMSSA9 IGVuZE9mUmVjb3ZlcnlJbmZvLT5sYXN0UmVjVExJOwogCWlmIChBcmNoaXZlUmVjb3ZlcnlSZXF1 ZXN0ZWQpCiAJeworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJcGdfdXVpZF90CXV1aWRfYnVmOwor CiAJCW5ld1RMSSA9IGZpbmROZXdlc3RUaW1lTGluZShyZWNvdmVyeVRhcmdldFRMSSkgKyAxOwog CQllcmVwb3J0KExPRywKIAkJCQkoZXJybXNnKCJzZWxlY3RlZCBuZXcgdGltZWxpbmUgSUQ6ICV1 IiwgbmV3VExJKSkpOwpAQCAtNjQwOCw4ICs2NDEyLDE5IEBAIFN0YXJ0dXBYTE9HKHZvaWQpCiAJ CSAqIHRvIHRoZSBuZXcgdGltZWxpbmUsIGFuZCB3aWxsIHRyeSB0byBjb25uZWN0IHRvIHRoZSBu ZXcgdGltZWxpbmUuCiAJCSAqIFRvIG1pbmltaXplIHRoZSB3aW5kb3cgZm9yIHRoYXQsIHRyeSB0 byBkbyBhcyBsaXR0bGUgYXMgcG9zc2libGUKIAkJICogYmV0d2VlbiBoZXJlIGFuZCB3cml0aW5n IHRoZSBlbmQtb2YtcmVjb3ZlcnkgcmVjb3JkLgorCQkgKgorCQkgKiBHZW5lcmF0ZSBhIFVVSUR2 NyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBwcm9tb3Rpb24uICBUaGUKKwkJICogc2Ft ZSBVVUlEIGlzIHdyaXR0ZW4gaW50byB0aGUgaGlzdG9yeSBmaWxlIHNvIHRoYXQgcGdfcmV3aW5k IGNhbgorCQkgKiBkaXN0aW5ndWlzaCB0d28gc2VydmVycyB0aGF0IGluZGVwZW5kZW50bHkgcHJv bW90ZWQgdG8gdGhlIHNhbWUKKwkJICogdGltZWxpbmUgSUQuICBVc2UgZ2V0dGltZW9mZGF5KCkg c2luY2Ugd2UgYXJlIG5vdCBvbiBhIGhvdCBwYXRoOworCQkgKiBnZW5lcmF0ZV91dWlkdjcgd2Fu dHMgbWlsbGlzZWNvbmRzIGFuZCB3ZSBwYXNzIDAgZm9yIHN1Yi1tcyBzaW5jZQorCQkgKiB0aGUg cmFuZG9tIGJpdHMgYWxyZWFkeSBkaXN0aW5ndWlzaCBVVUlEcyBnZW5lcmF0ZWQgd2l0aGluIHRo ZSBzYW1lCisJCSAqIG1pbGxpc2Vjb25kLgogCQkgKi8KKwkJZ2V0dGltZW9mZGF5KCZ0diwgTlVM TCk7CisJCWdlbmVyYXRlX3V1aWR2N19yKCZ1dWlkX2J1ZiwgdHYudHZfc2VjICogMTAwMCArIHR2 LnR2X3VzZWMgLyAxMDAwLCAwKTsKIAkJd3JpdGVUaW1lTGluZUhpc3RvcnkobmV3VExJLCByZWNv dmVyeVRhcmdldFRMSSwKKwkJCQkJCQkgJnV1aWRfYnVmLAogCQkJCQkJCSBFbmRPZkxvZywgZW5k T2ZSZWNvdmVyeUluZm8tPnJlY292ZXJ5U3RvcFJlYXNvbik7CiAKIAkJZXJlcG9ydChMT0csCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvdXVpZC5jIGIvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L3V1aWQuYwppbmRleCA2ZWUzNzUyYWM3OC4uZjFkYzAxOTZjZDggMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL3V0aWxzL2FkdC91dWlkLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L3V1aWQuYwpAQCAtNzIsNyArNzIsNyBAQCBzdGF0aWMgYm9vbCB1dWlkX2FiYnJldl9hYm9ydChp bnQgbWVtdHVwY291bnQsIFNvcnRTdXBwb3J0IHNzdXApOwogc3RhdGljIERhdHVtIHV1aWRfYWJi cmV2X2NvbnZlcnQoRGF0dW0gb3JpZ2luYWwsIFNvcnRTdXBwb3J0IHNzdXApOwogc3RhdGljIGlu bGluZSB2b2lkIHV1aWRfc2V0X3ZlcnNpb24ocGdfdXVpZF90ICp1dWlkLCB1bnNpZ25lZCBjaGFy IHZlcnNpb24pOwogc3RhdGljIGlubGluZSBpbnQ2NCBnZXRfcmVhbF90aW1lX25zX2FzY2VuZGlu Zyh2b2lkKTsKLXN0YXRpYyBwZ191dWlkX3QgKmdlbmVyYXRlX3V1aWR2Nyh1aW50NjQgdW5peF90 c19tcywgdWludDMyIHN1Yl9tcyk7CitwZ191dWlkX3QgICpnZW5lcmF0ZV91dWlkdjcodWludDY0 IHVuaXhfdHNfbXMsIHVpbnQzMiBzdWJfbXMpOwogCiBEYXR1bQogdXVpZF9pbihQR19GVU5DVElP Tl9BUkdTKQpAQCAtNTgxLDYgKzU4MSwxNCBAQCBnZXRfcmVhbF90aW1lX25zX2FzY2VuZGluZyh2 b2lkKQogCXJldHVybiBuczsKIH0KIAorcGdfdXVpZF90ICoKK2dlbmVyYXRlX3V1aWR2Nyh1aW50 NjQgdW5peF90c19tcywgdWludDMyIHN1Yl9tcykKK3sKKwlwZ191dWlkX3QgICp1dWlkID0gcGFs bG9jKFVVSURfTEVOKTsKKworCXJldHVybiBnZW5lcmF0ZV91dWlkdjdfcih1dWlkLCB1bml4X3Rz X21zLCBzdWJfbXMpOworfQorCiAvKgogICogR2VuZXJhdGUgVVVJRCB2ZXJzaW9uIDcgcGVyIFJG QyA5NTYyLCB3aXRoIHRoZSBnaXZlbiB0aW1lc3RhbXAuCiAgKgpAQCAtNTk3LDEwICs2MDUsOSBA QCBnZXRfcmVhbF90aW1lX25zX2FzY2VuZGluZyh2b2lkKQogICoKICAqIE5COiBhbGwgbnVtYmVy cyBoZXJlIGFyZSB1bnNpZ25lZCwgdW5peF90c19tcyBjYW5ub3QgYmUgbmVnYXRpdmUgcGVyIFJG Qy4KICAqLwotc3RhdGljIHBnX3V1aWRfdCAqCi1nZW5lcmF0ZV91dWlkdjcodWludDY0IHVuaXhf dHNfbXMsIHVpbnQzMiBzdWJfbXMpCitwZ191dWlkX3QgKgorZ2VuZXJhdGVfdXVpZHY3X3IocGdf dXVpZF90ICp1dWlkLCB1aW50NjQgdW5peF90c19tcywgdWludDMyIHN1Yl9tcykKIHsKLQlwZ191 dWlkX3QgICp1dWlkID0gcGFsbG9jKFVVSURfTEVOKTsKIAl1aW50MzIJCWluY3JlYXNlZF9jbG9j a19wcmVjaXNpb247CiAKIAkvKiBGaWxsIGluIHRpbWUgcGFydCAqLwpkaWZmIC0tZ2l0IGEvc3Jj L2Jpbi9wZ19yZXdpbmQvcGdfcmV3aW5kLmMgYi9zcmMvYmluL3BnX3Jld2luZC9wZ19yZXdpbmQu YwppbmRleCA5ZDc0NWQ0YjI1Yi4uZGU1Yjc3MTE3ZDYgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcGdf cmV3aW5kL3BnX3Jld2luZC5jCisrKyBiL3NyYy9iaW4vcGdfcmV3aW5kL3BnX3Jld2luZC5jCkBA IC0zMiw2ICszMiwxOSBAQAogI2luY2x1ZGUgInJld2luZF9zb3VyY2UuaCIKICNpbmNsdWRlICJz dG9yYWdlL2J1ZnBhZ2UuaCIKIAorLyoKKyAqIFRpbWVsaW5lIGhpc3RvcmllcyBmb3IgYm90aCBj bHVzdGVycywgcG9wdWxhdGVkIGJ5IG1hdGNoQW5kRmV0Y2hUaW1lbGluZXMoKS4KKyAqLwordHlw ZWRlZiBzdHJ1Y3QgVGltZUxpbmVIaXN0b3JpZXNEYXRhCit7CisJVGltZUxpbmVIaXN0b3J5RW50 cnkgKnNvdXJjZSwKKwkJCSAgICp0YXJnZXQ7CisJaW50CQkJc291cmNlTmVudHJpZXMsCisJCQkJ dGFyZ2V0TmVudHJpZXM7Cit9CQkJVGltZUxpbmVIaXN0b3JpZXNEYXRhOworCit0eXBlZGVmIFRp bWVMaW5lSGlzdG9yaWVzRGF0YSAqVGltZUxpbmVIaXN0b3JpZXM7CisKIHN0YXRpYyB2b2lkIHVz YWdlKGNvbnN0IGNoYXIgKnByb2duYW1lKTsKIAogc3RhdGljIHZvaWQgcGVyZm9ybV9yZXdpbmQo ZmlsZW1hcF90ICpmaWxlbWFwLCByZXdpbmRfc291cmNlICpzb3VyY2UsCkBAIC01Myw2ICs2Niw5 IEBAIHN0YXRpYyB2b2lkIGZpbmRDb21tb25BbmNlc3RvclRpbWVsaW5lKFRpbWVMaW5lSGlzdG9y eUVudHJ5ICphX2hpc3RvcnksCiAJCQkJCQkJCQkgICBUaW1lTGluZUhpc3RvcnlFbnRyeSAqYl9o aXN0b3J5LAogCQkJCQkJCQkJICAgaW50IGJfbmVudHJpZXMsCiAJCQkJCQkJCQkgICBYTG9nUmVj UHRyICpyZWNwdHIsIGludCAqdGxpSW5kZXgpOworc3RhdGljIGlubGluZSBib29sIG1hdGNoaW5n VGltZWxpbmVVVUlEKFRpbWVMaW5lSGlzdG9yeUVudHJ5ICphLCBUaW1lTGluZUhpc3RvcnlFbnRy eSAqYik7CitzdGF0aWMgYm9vbCBtYXRjaEFuZEZldGNoVGltZWxpbmVzKFRpbWVMaW5lSUQgc291 cmNlX3RsaSwgVGltZUxpbmVJRCB0YXJnZXRfdGxpLAorCQkJCQkJCQkgICBUaW1lTGluZUhpc3Rv cmllcyB0aW1lbGluZUhpc3Rvcmllcyk7CiBzdGF0aWMgdm9pZCBlbnN1cmVDbGVhblNodXRkb3du KGNvbnN0IGNoYXIgKmFyZ3YwKTsKIHN0YXRpYyB2b2lkIGRpc2Nvbm5lY3RfYXRleGl0KHZvaWQp OwogCkBAIC0xNDEsNiArMTU3LDcgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJaW50 CQkJYzsKIAlYTG9nUmVjUHRyCWRpdmVyZ2VyZWM7CiAJaW50CQkJbGFzdGNvbW1vbnRsaUluZGV4 OworCVRpbWVMaW5lSGlzdG9yaWVzRGF0YSB0aW1lbGluZUhpc3RvcmllczsKIAlYTG9nUmVjUHRy CWNoa3B0cmVjOwogCVRpbWVMaW5lSUQJY2hrcHR0bGk7CiAJWExvZ1JlY1B0cgljaGtwdHJlZG87 CkBAIC0zNzIsMTAgKzM4OSwyMSBAQCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkgKgog CSAqIElmIGJvdGggY2x1c3RlcnMgYXJlIGFscmVhZHkgb24gdGhlIHNhbWUgdGltZWxpbmUsIHRo ZXJlJ3Mgbm90aGluZyB0bwogCSAqIGRvLgorCSAqCisJICogVGhpcyBhbHNvIGhhbmRsZXMgdGhl IGNhc2Ugd2hlbiB0d28gc2VydmVycyBpbmRlcGVuZGVudGx5IHByb21vdGVkIHRvCisJICogdGhl IHNhbWUgdGltZWxpbmUgSUQ6IG9uZSBjcmFzaGVkIGFmdGVyIHdyaXRpbmcgdGhlIGhpc3Rvcnkg ZmlsZSBidXQKKwkgKiBiZWZvcmUgaXRzIEVPUiBXQUwgcmVjb3JkIHdhcyBkaXN0cmlidXRlZCwg c28gYSBzZWNvbmQgc3RhbmRieSBwcm9tb3RlZAorCSAqIGluZGVwZW5kZW50bHkuICBUaGUgaGlz dG9yeSBmaWxlcyBwcm9kdWNlZCBieSB0aG9zZSB0d28gcHJvbW90aW9ucworCSAqIGNhcnJ5IGRp ZmZlcmVudCBVVUlEcy4KKwkgKgorCSAqIFdoZW4gdGhlIGNsdXN0ZXJzIGFyZSBvbiBkaWZmZXJl bnQgdGltZWxpbmVzIHdlIGxvY2F0ZSB0aGUgZm9yayBwb2ludAorCSAqIHZpYSBmaW5kQ29tbW9u QW5jZXN0b3JUaW1lbGluZS4KIAkgKi8KLQlpZiAodGFyZ2V0X3RsaSA9PSBzb3VyY2VfdGxpKQor CWlmIChtYXRjaEFuZEZldGNoVGltZWxpbmVzKHNvdXJjZV90bGksIHRhcmdldF90bGksICZ0aW1l bGluZUhpc3RvcmllcykpCiAJewogCQlwZ19sb2dfaW5mbygic291cmNlIGFuZCB0YXJnZXQgY2x1 c3RlciBhcmUgb24gdGhlIHNhbWUgdGltZWxpbmUiKTsKKwkJcGZyZWUodGltZWxpbmVIaXN0b3Jp ZXMuc291cmNlKTsKKwkJcGZyZWUodGltZWxpbmVIaXN0b3JpZXMudGFyZ2V0KTsKIAkJcmV3aW5k X25lZWRlZCA9IGZhbHNlOwogCQl0YXJnZXRfd2FsX2VuZHJlYyA9IEludmFsaWRYTG9nUmVjUHRy OwogCX0KQEAgLTM4OSw4ICs0MTcsMTAgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJ CSAqIFJldHJpZXZlIHRpbWVsaW5lcyBmb3IgYm90aCBzb3VyY2UgYW5kIHRhcmdldCwgYW5kIGZp bmQgdGhlIHBvaW50CiAJCSAqIHdoZXJlIHRoZXkgZGl2ZXJnZWQuCiAJCSAqLwotCQlzb3VyY2VI aXN0b3J5ID0gZ2V0VGltZWxpbmVIaXN0b3J5KHNvdXJjZV90bGksIHRydWUsICZzb3VyY2VOZW50 cmllcyk7Ci0JCXRhcmdldEhpc3RvcnkgPSBnZXRUaW1lbGluZUhpc3RvcnkodGFyZ2V0X3RsaSwg ZmFsc2UsICZ0YXJnZXROZW50cmllcyk7CisJCXRhcmdldEhpc3RvcnkgPSB0aW1lbGluZUhpc3Rv cmllcy50YXJnZXQ7CisJCXRhcmdldE5lbnRyaWVzID0gdGltZWxpbmVIaXN0b3JpZXMudGFyZ2V0 TmVudHJpZXM7CisJCXNvdXJjZUhpc3RvcnkgPSB0aW1lbGluZUhpc3Rvcmllcy5zb3VyY2U7CisJ CXNvdXJjZU5lbnRyaWVzID0gdGltZWxpbmVIaXN0b3JpZXMuc291cmNlTmVudHJpZXM7CiAKIAkJ ZmluZENvbW1vbkFuY2VzdG9yVGltZWxpbmUoc291cmNlSGlzdG9yeSwgc291cmNlTmVudHJpZXMs CiAJCQkJCQkJCSAgIHRhcmdldEhpc3RvcnksIHRhcmdldE5lbnRyaWVzLApAQCAtODc0LDcgKzkw NCw3IEBAIGdldFRpbWVsaW5lSGlzdG9yeShUaW1lTGluZUlEIHRsaSwgYm9vbCBpc19zb3VyY2Us IGludCAqbmVudHJpZXMpCiAJICovCiAJaWYgKHRsaSA9PSAxKQogCXsKLQkJaGlzdG9yeSA9IHBn X21hbGxvY19vYmplY3QoVGltZUxpbmVIaXN0b3J5RW50cnkpOworCQloaXN0b3J5ID0gcGdfbWFs bG9jMF9vYmplY3QoVGltZUxpbmVIaXN0b3J5RW50cnkpOwogCQloaXN0b3J5LT50bGkgPSB0bGk7 CiAJCWhpc3RvcnktPmJlZ2luID0gaGlzdG9yeS0+ZW5kID0gSW52YWxpZFhMb2dSZWNQdHI7CiAJ CSpuZW50cmllcyA9IDE7CkBAIC05MjAsNiArOTUwLDU2IEBAIGdldFRpbWVsaW5lSGlzdG9yeShU aW1lTGluZUlEIHRsaSwgYm9vbCBpc19zb3VyY2UsIGludCAqbmVudHJpZXMpCiAJcmV0dXJuIGhp c3Rvcnk7CiB9CiAKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiB0d28gcGVyLWVudHJ5IHByb21vdGlv biBVVUlEcyBhcmUgY29tcGF0aWJsZS4KKyAqCisgKiBBIHplcm8gVVVJRCBtZWFucyB0aGUgaGlz dG9yeSBmaWxlIHByZWRhdGVzIHRoaXMgZml4IChvciB0aGUgZW50cnkgaXMKKyAqIHN5bnRoZXRp YykuICBJZiBib3RoIHNpZGVzIGFyZSB6ZXJvIHdlIGhhdmUgbm8gVVVJRCBpbmZvcm1hdGlvbiBh bmQgZmFsbAorICogYmFjayB0byBUTEktbnVtYmVyLW9ubHkgbWF0Y2hpbmcgKGJhY2t3YXJkIGNv bXBhdGliaWxpdHkgd2l0aCBvbGQgc2VydmVycykuCisgKiBJZiBvbmUgc2lkZSBjYXJyaWVzIGEg VVVJRCBhbmQgdGhlIG90aGVyIGRvZXMgbm90LCB0aGV5IGNhbm5vdCBvcmlnaW5hdGUKKyAqIGZy b20gdGhlIHNhbWUgcHJvbW90aW9uIGFuZCBhcmUgdHJlYXRlZCBhcyBpbmNvbXBhdGlibGUuCisg Ki8KK3N0YXRpYyBpbmxpbmUgYm9vbAorbWF0Y2hpbmdUaW1lbGluZVVVSUQoVGltZUxpbmVIaXN0 b3J5RW50cnkgKmEsIFRpbWVMaW5lSGlzdG9yeUVudHJ5ICpiKQoreworCXN0YXRpYyBjb25zdCBw Z191dWlkX3QgemVybyA9IHt7MH19OworCisJaWYgKG1lbWNtcCgmYS0+dGx1dWlkLCAmemVybywg VVVJRF9MRU4pID09IDAgJiYgbWVtY21wKCZiLT50bHV1aWQsICZ6ZXJvLCBVVUlEX0xFTikgPT0g MCkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIG1lbWNtcCgmYS0+dGx1dWlkLCAmYi0+dGx1dWlk LCBVVUlEX0xFTikgPT0gMDsKK30KKworLyoKKyAqIEZldGNoIHRoZSB0aW1lbGluZSBoaXN0b3J5 IGZvciBib3RoIGNsdXN0ZXJzLCBzdG9yZSB0aGVtIGluIHRsaCwgYW5kIHJldHVybgorICogdHJ1 ZSBpZiB0aGUgY2x1c3RlcnMgYXJlIG9uIHRoZSBzYW1lIHRpbWVsaW5lIChubyByZXdpbmQgbmVl ZGVkKS4KKyAqCisgKiB0bGggaXMgYWx3YXlzIGZ1bGx5IHBvcHVsYXRlZCBvbiByZXR1cm4gcmVn YXJkbGVzcyBvZiB0aGUgcmVzdWx0LCBzbyB0aGUKKyAqIGNhbGxlciBjYW4gcGFzcyB0bGgtPnNv dXJjZSAvIHRsaC0+dGFyZ2V0IGRpcmVjdGx5IHRvCisgKiBmaW5kQ29tbW9uQW5jZXN0b3JUaW1l bGluZSgpIHdoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBmYWxzZS4KKyAqCisgKiBUTEkgMSBhbHdh eXMgcmV0dXJucyB0cnVlOiBpdCBpcyB0aGUgb3JpZ2luYWwgdGltZWxpbmUgYW5kIGhhcyBubyBw cm9tb3Rpb24KKyAqIFVVSUQuICBGb3IgVExJID49IDIsIHRoZSBVVUlEIGluIGVudHJ5W05lbnRy aWVzIC0gMl0gaWRlbnRpZmllcyB0aGUKKyAqIHByb21vdGlvbiB0aGF0IGNyZWF0ZWQgdGhlIGN1 cnJlbnQgVExJLiAgQm90aC16ZXJvIFVVSURzIChvbGQgaGlzdG9yeSBmaWxlcykKKyAqIGFyZSB0 cmVhdGVkIGFzIGNvbXBhdGlibGU7IHplcm8tdnMtbm9uemVybyBpcyB0cmVhdGVkIGFzIGEgbWlz bWF0Y2ggYmVjYXVzZQorICogb25lIHNpZGUgY2FycmllcyBhIHByb21vdGlvbiBVVUlEIGFuZCB0 aGV5IGNhbm5vdCBiZSB0aGUgc2FtZSBwcm9tb3Rpb24uCisgKi8KK3N0YXRpYyBib29sCittYXRj aEFuZEZldGNoVGltZWxpbmVzKFRpbWVMaW5lSUQgc291cmNlX3RsaSwgVGltZUxpbmVJRCB0YXJn ZXRfdGxpLCBUaW1lTGluZUhpc3RvcmllcyB0bGgpCit7CisJdGxoLT5zb3VyY2UgPSBnZXRUaW1l bGluZUhpc3Rvcnkoc291cmNlX3RsaSwgdHJ1ZSwgJnRsaC0+c291cmNlTmVudHJpZXMpOworCXRs aC0+dGFyZ2V0ID0gZ2V0VGltZWxpbmVIaXN0b3J5KHRhcmdldF90bGksIGZhbHNlLCAmdGxoLT50 YXJnZXROZW50cmllcyk7CisKKwlpZiAoc291cmNlX3RsaSAhPSB0YXJnZXRfdGxpKQorCQlyZXR1 cm4gZmFsc2U7CisKKwkvKiBUTEkgMSBoYXMgbm8gcHJvbW90aW9uIFVVSUQ7IGFsd2F5cyB0cmVh dCBhcyB0aGUgc2FtZSB0aW1lbGluZS4gKi8KKwlpZiAodGxoLT5zb3VyY2VOZW50cmllcyA8IDIg fHwgdGxoLT50YXJnZXROZW50cmllcyA8IDIpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIG1h dGNoaW5nVGltZWxpbmVVVUlEKCZ0bGgtPnNvdXJjZVt0bGgtPnNvdXJjZU5lbnRyaWVzIC0gMl0s CisJCQkJCQkJCSZ0bGgtPnRhcmdldFt0bGgtPnRhcmdldE5lbnRyaWVzIC0gMl0pOworfQorCiAv KgogICogRGV0ZXJtaW5lIHRoZSBUTEkgb2YgdGhlIGxhc3QgY29tbW9uIHRpbWVsaW5lIGluIHRo ZSB0aW1lbGluZSBoaXN0b3J5IG9mCiAgKiB0d28gY2x1c3RlcnMuICp0bGlJbmRleCBpcyBzZXQg dG8gdGhlIGluZGV4IG9mIGxhc3QgY29tbW9uIHRpbWVsaW5lIGluCkBAIC05NDEsMTIgKzEwMjEs MjYgQEAgZmluZENvbW1vbkFuY2VzdG9yVGltZWxpbmUoVGltZUxpbmVIaXN0b3J5RW50cnkgKmFf aGlzdG9yeSwgaW50IGFfbmVudHJpZXMsCiAJICogZGVwZW5kaW5nIG9uIHRoZSBoaXN0b3J5IGZp bGVzIHRoYXQgZWFjaCBub2RlIGhhcyBmZXRjaGVkIGluIHByZXZpb3VzCiAJICogcmVjb3Zlcnkg cHJvY2Vzc2VzLiBIZW5jZSBjaGVjayB0aGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIG5ldyB0aW1l bGluZQogCSAqIGFzIHdlbGwgYW5kIG1vdmUgZG93biBieSBvbmUgZXh0cmEgdGltZWxpbmUgZW50 cnkgaWYgdGhleSBkbyBub3QgbWF0Y2guCisJICoKKwkgKiBXZSBhbHNvIGNvbXBhcmUgdGltZWxp bmUgVVVJRHMgd2hlbiBib3RoIHNpZGVzIGNhcnJ5IG9uZS4gIFR3byBzZXJ2ZXJzCisJICogdGhh dCBpbmRlcGVuZGVudGx5IHByb21vdGVkIHRvIHRoZSBzYW1lIHRpbWVsaW5lIElEIHByb2R1Y2Ug aGlzdG9yeQorCSAqIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZSAoZS5nLiAwMDAwMDAwMy5oaXN0 b3J5KTsgaW4gYSBzaGFyZWQgV0FMCisJICogYXJjaGl2ZSB0aGUgc2Vjb25kIGZpbGUgc2lsZW50 bHkgb3ZlcndyaXRlcyB0aGUgZmlyc3QuICBwZ19yZXdpbmQKKwkgKiBmZXRjaGVzIGVhY2ggc2Vy dmVyJ3MgaGlzdG9yeSBmaWxlIGRpcmVjdGx5IGZyb20gdGhhdCBzZXJ2ZXIsIHNvIGl0CisJICog c2VlcyBib3RoIFVVSURzLgorCSAqCisJICogVGhlIHRpbWVsaW5lIFVVSUQgc3RvcmVkIGluIGhp c3RvcnkgZW50cnlbaV0gaXMgdGhlIFVVSUQgb2YgdGhlCisJICogcHJvbW90aW9uIHRoYXQgY3Jl YXRlZCBlbnRyeVtpKzFdLCBpLmUuIHRoZSBVVUlEIG9mIFRMSSBlbnRyeVtpKzFdLnRsaS4KKwkg KiBTbyB0byBjaGVjayB3aGV0aGVyIGVudHJ5W2ldIGl0c2VsZiByZXByZXNlbnRzIHRoZSBzYW1l IHRpbWVsaW5lIG9uCisJICogYm90aCBzaWRlcyB3ZSBsb29rIGF0IGVudHJ5W2ktMV0udGx1dWlk IChmb3IgaSA+IDApLiAgVExJIDEgKGkgPT0gMCkgaXMKKwkgKiBhbHdheXMgdGhlIHNhbWU6IGl0 IGlzIHRoZSBvcmlnaW5hbCB0aW1lbGluZSBhbmQgaGFzIG5vIHByb21vdGlvbiBVVUlELgogCSAq LwogCW4gPSBNaW4oYV9uZW50cmllcywgYl9uZW50cmllcyk7CiAJZm9yIChpID0gMDsgaSA8IG47 IGkrKykKIAl7CiAJCWlmIChhX2hpc3RvcnlbaV0udGxpICE9IGJfaGlzdG9yeVtpXS50bGkgfHwK LQkJCWFfaGlzdG9yeVtpXS5iZWdpbiAhPSBiX2hpc3RvcnlbaV0uYmVnaW4pCisJCQlhX2hpc3Rv cnlbaV0uYmVnaW4gIT0gYl9oaXN0b3J5W2ldLmJlZ2luIHx8CisJCQkoaSA+IDAgJiYgIW1hdGNo aW5nVGltZWxpbmVVVUlEKCZhX2hpc3RvcnlbaSAtIDFdLCAmYl9oaXN0b3J5W2kgLSAxXSkpKQog CQkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9zcmMvYmluL3BnX3Jld2luZC90LzAwNV9zYW1l X3RpbWVsaW5lLnBsIGIvc3JjL2Jpbi9wZ19yZXdpbmQvdC8wMDVfc2FtZV90aW1lbGluZS5wbApp bmRleCA5NWE0MGMzYjI3MC4uOWI4ZTgyMDQ3NzUgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcGdfcmV3 aW5kL3QvMDA1X3NhbWVfdGltZWxpbmUucGwKKysrIGIvc3JjL2Jpbi9wZ19yZXdpbmQvdC8wMDVf c2FtZV90aW1lbGluZS5wbApAQCAtNyw2ICs3LDggQEAKICMKIHVzZSBzdHJpY3Q7CiB1c2Ugd2Fy bmluZ3MgRkFUQUwgPT4gJ2FsbCc7Cit1c2UgRmlsZTo6Q29weTsKK3VzZSBQb3N0Z3JlU1FMOjpU ZXN0OjpDbHVzdGVyOwogdXNlIFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOwogdXNlIFRlc3Q6Ok1v cmU7CiAKQEAgLTIxLDQgKzIzLDM1NSBAQCBSZXdpbmRUZXN0OjpjcmVhdGVfc3RhbmRieSgpOwog UmV3aW5kVGVzdDo6cnVuX3BnX3Jld2luZCgnbG9jYWwnKTsKIFJld2luZFRlc3Q6OmNsZWFuX3Jl d2luZF90ZXN0KCk7CiAKKyMgSGVscGVyIGZ1bmN0aW9uIHRvIHJ1biBwZ19yZXdpbmQgaW4gbG9j YWwgbW9kZSB3aXRoIHRoZSBnaXZlbiBzb3VyY2UgYW5kCisjIHRhcmdldCBub2RlcyBhbmQgZXh0 cmEgYXJndW1lbnRzLgorIworIyBUaGUgdGFyZ2V0IGFuZCBzb3VyY2Ugbm9kZXMgYXJlIHN0b3Bw ZWQgYmVmb3JlIHRoZSBjYWxsIGFuZCB0aGUgdGFyZ2V0IGlzCisjIHJlc3RhcnRlZCBhZnRlcndh cmQuICBUaGUgdGFyZ2V0J3MgcG9zdGdyZXNxbC5jb25mIGlzIGNvcGllZCB0byBhIHRlbXBvcmFy eQorIyBsb2NhdGlvbiBhbmQgcGFzc2VkIHRvIHBnX3Jld2luZCB3aXRoIC0tY29uZmlnLWZpbGUs IHNvIHRoYXQgcGdfcmV3aW5kIGNhbgorIyB1cGRhdGUgdGhlIHRhcmdldCdzIGNvbmZpZyBmaWxl IGluIHBsYWNlIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgZmlsZQorIyBwZXJtaXNzaW9ucy4gIFRo ZSB0ZW1wb3JhcnkgY29uZmlnIGZpbGUgaXMgbW92ZWQgYmFjayB0byB0aGUgdGFyZ2V0J3MgZGF0 YQorIyBkaXJlY3RvcnkgYW5kIHBlcm1pc3Npb25zIGZpeGVkIGFmdGVyIHBnX3Jld2luZCBmaW5p c2hlcy4KK3N1YiByZXdpbmRfbm9kZQoreworCW15ICgkdGFyZ2V0LCAkc291cmNlLCAkbGFiZWws IEBleHRyYV9hcmdzKSA9IEBfOworCSRzb3VyY2UtPnN0b3A7CisJJHRhcmdldC0+c3RvcDsKKwor CW15ICR0cGdkYXRhID0gJHRhcmdldC0+ZGF0YV9kaXI7CisJbXkgJHRtcCA9IFBvc3RncmVTUUw6 OlRlc3Q6OlV0aWxzOjp0ZW1wZGlyOworCWNvcHkoIiR0cGdkYXRhL3Bvc3RncmVzcWwuY29uZiIs ICIkdG1wL3RhcmdldC1wb3N0Z3Jlc3FsLmNvbmYudG1wIik7CisKKwljb21tYW5kX29rKAorCQlb CisJCQkncGdfcmV3aW5kJywKKwkJCSctLWRlYnVnJywKKwkJCSctLXNvdXJjZS1wZ2RhdGEnID0+ ICRzb3VyY2UtPmRhdGFfZGlyLAorCQkJJy0tdGFyZ2V0LXBnZGF0YScgPT4gJHRhcmdldC0+ZGF0 YV9kaXIsCisJCQknLS1uby1zeW5jJywKKwkJCSctLWNvbmZpZy1maWxlJyA9PiAiJHRtcC90YXJn ZXQtcG9zdGdyZXNxbC5jb25mLnRtcCIsCisJCQlAZXh0cmFfYXJncywKKwkJXSwKKwkJJGxhYmVs KTsKKworCW1vdmUoIiR0bXAvdGFyZ2V0LXBvc3RncmVzcWwuY29uZi50bXAiLCAiJHRwZ2RhdGEv cG9zdGdyZXNxbC5jb25mIik7CisJY2htb2QoJHRhcmdldC0+Z3JvdXBfYWNjZXNzKCkgPyAwNjQw IDogMDYwMCwgIiR0cGdkYXRhL3Bvc3RncmVzcWwuY29uZiIpCisJICBvciBCQUlMX09VVCgidW5h YmxlIHRvIHNldCBwZXJtaXNzaW9ucyBmb3IgJHRwZ2RhdGEvcG9zdGdyZXNxbC5jb25mIik7CisK KwkkdGFyZ2V0LT5zdGFydDsKK30KKworIyBSZXdyaXRlIGEgbm9kZSdzIFRMSSBoaXN0b3J5IGZp bGUgaW4gdGhlIG9sZCAzLWZpZWxkIGZvcm1hdCAobm8gVVVJRCksIHNvCisjIHRoYXQgcGdfcmV3 aW5kIHNlZXMgYSB6ZXJvIFVVSUQgZm9yIHRoYXQgc2lkZSwgYXMgaWYgdGhlIG5vZGUgaGFkIGJl ZW4KKyMgcHJvbW90ZWQgYnkgYSBzZXJ2ZXIgdGhhdCBwcmVkYXRlcyB0aGUgVVVJRCBmZWF0dXJl Lgorc3ViIHN0cmlwX3RsaV91dWlkCit7CisJbXkgKCRub2RlLCAkdGxpKSA9IEBfOworCW15ICRo aXN0ZmlsZSA9IHNwcmludGYoIiVzL3BnX3dhbC8lMDhYLmhpc3RvcnkiLCAkbm9kZS0+ZGF0YV9k aXIsICR0bGkpOworCW9wZW4obXkgJGZoLCAnPCcsICRoaXN0ZmlsZSkgb3IgZGllICJjYW5ub3Qg b3BlbiAkaGlzdGZpbGU6ICQhIjsKKwlteSBAbGluZXMgPSA8JGZoPjsKKwljbG9zZSAkZmg7CisJ b3BlbigkZmgsICc+JywgJGhpc3RmaWxlKSBvciBkaWUgImNhbm5vdCB3cml0ZSAkaGlzdGZpbGU6 ICQhIjsKKwlmb3IgbXkgJGxpbmUgKEBsaW5lcykKKwl7CisJCWNob21wICRsaW5lOworCQlteSBA ZiA9IHNwbGl0KC9cdC8sICRsaW5lLCA0KTsKKwkJaWYgKEBmID09IDQpCisJCXsKKwkJCSMgRHJv cCB0aGUgVVVJRCBmaWVsZCAoaW5kZXggMik7IGtlZXAgcGFyZW50VExJLCBzd2l0Y2hwb2ludCwg cmVhc29uLgorCQkJcHJpbnQgJGZoIGpvaW4oIlx0IiwgJGZbMF0sICRmWzFdLCAkZlszXSkgLiAi XG4iOworCQl9CisJCWVsc2UKKwkJeworCQkJcHJpbnQgJGZoICIkbGluZVxuIjsKKwkJfQorCX0K KwljbG9zZSAkZmg7Cit9CisKKyMgSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBvcmlnaW4g bm9kZSB3aXRoIGEgdGVzdCB0YWJsZSBhbmQgYSByb3cgY29udGFpbmluZworIyB0aGUgZ2l2ZW4g bGFiZWwuICBUaGUgbm9kZSBpcyBzdGFydGVkIGFuZCByZWFkeSBmb3IgdXNlIGFzIGEgc291cmNl IGZvcgorIyBzdGFuZGJ5cy4KK3N1YiBzZXR1cF9vcmlnaW4KK3sKKwlteSAoJGxhYmVsKSA9IEBf OworCW15ICRub2RlID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCRsYWJlbCk7CisJ JG5vZGUtPmluaXQoYWxsb3dzX3N0cmVhbWluZyA9PiAxKTsKKwkkbm9kZS0+YXBwZW5kX2NvbmYo J3Bvc3RncmVzcWwuY29uZicsICJ3YWxfa2VlcF9zaXplID0gMzIwTUJcbiIpOworCSRub2RlLT5z dGFydDsKKwkkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJDUkVBVEUgVEFCTEUgdGJsICh2 YWwgdGV4dCkiKTsKKwkkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJJTlNFUlQgSU5UTyB0 YmwgVkFMVUVTICgnJGxhYmVsJykiKTsKKwkkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICdD SEVDS1BPSU5UJyk7CisJcmV0dXJuICRub2RlOworfQorCisjIEhlbHBlciBmdW5jdGlvbiB0byBj cmVhdGUgbXVsdGlwbGUgc3RhbmRieSBub2RlcyBmcm9tIHRoZSBzYW1lIG9yaWdpbiBub2RlLgor IyBFYWNoIHN0YW5kYnkgZ2V0cyBpdHMgb3duIGJhY2t1cCBhbmQgZGF0YSBkaXJlY3RvcnksIHNv IHRoYXQgdGhleSB3aWxsCisjIGdlbmVyYXRlIGluZGVwZW5kZW50IFVVSURzIG9uIHByb21vdGlv biBldmVuIHRob3VnaCB0aGV5IHNoYXJlIHRoZSBzYW1lCisjIHRpbWVsaW5lIGhpc3RvcnkgdXAg dG8gdGhlIHBvaW50IG9mIHByb21vdGlvbi4KK3N1YiBzZXR1cF9zdGFuZGJ5c19mcm9tX29yaWdp bgoreworCW15ICgkb3JpZ2luLCBAbmFtZXMpID0gQF87CisJbXkgQHN0YW5kYnlzOworCWZvciBt eSAkbmFtZSAoQG5hbWVzKQorCXsKKwkJbXkgJHN0YW5kYnkgPSBQb3N0Z3JlU1FMOjpUZXN0OjpD bHVzdGVyLT5uZXcoJG5hbWUpOworCQkkb3JpZ2luLT5iYWNrdXAoJHN0YW5kYnktPm5hbWUpOwor CQkkc3RhbmRieS0+aW5pdF9mcm9tX2JhY2t1cCgkb3JpZ2luLCAkc3RhbmRieS0+bmFtZSwKKwkJ CWhhc19zdHJlYW1pbmcgPT4gMSk7CisJCSRzdGFuZGJ5LT5hcHBlbmRfY29uZigncG9zdGdyZXNx bC5jb25mJywgIndhbF9rZWVwX3NpemUgPSAzMjBNQlxuIik7CisJCSRzdGFuZGJ5LT5zZXRfc3Rh bmRieV9tb2RlKCk7CisJCSRzdGFuZGJ5LT5zdGFydDsKKwkJcHVzaCBAc3RhbmRieXMsICRzdGFu ZGJ5OworCX0KKwlyZXR1cm4gQHN0YW5kYnlzOworfQorCisjIEhlbHBlciBmdW5jdGlvbiB0byB3 YWl0IGZvciBtdWx0aXBsZSBzdGFuZGJ5IG5vZGVzIHRvIGNhdGNoIHVwIHRvIHRoZSBvcmlnaW4u CitzdWIgc3luY19zdGFuZGJ5c193aXRoX29yaWdpbgoreworCW15ICgkb3JpZ2luLCBAc3RhbmRi eXMpID0gQF87CisJJG9yaWdpbi0+d2FpdF9mb3JfY2F0Y2h1cCgkXykgZm9yIEBzdGFuZGJ5czsK K30KKworIyBIZWxwZXIgZnVuY3Rpb24gdG8gaW5zZXJ0IGEgcm93IHdpdGggdGhlIGdpdmVuIGxh YmVsIGludG8gYSBub2RlJ3MgdGVzdCB0YWJsZS4KK3N1YiB3cml0ZV9yZWNvcmQKK3sKKwlteSAo JG5vZGUsICRsYWJlbCkgPSBAXzsKKwkkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJJTlNF UlQgSU5UTyB0YmwgVkFMVUVTICgnJGxhYmVsJykiKTsKKwkkbm9kZS0+c2FmZV9wc3FsKCdwb3N0 Z3JlcycsICdDSEVDS1BPSU5UJyk7Cit9CisKKyMgVGVzdCB0aGF0IHBnX3Jld2luZCBkZXRlY3Rz IGFuZCBoYW5kbGVzIHR3byBzdGFuZGJ5cyB0aGF0IGluZGVwZW5kZW50bHkKKyMgcHJvbW90ZWQg dG8gdGhlIHNhbWUgdGltZWxpbmUgSUQuICBCZWZvcmUgdGhlIFVVSUQtYmFzZWQgZGl2ZXJnZW5j ZSBjaGVjaywKKyMgcGdfcmV3aW5kJ3Mgc2FtZS1UTEkgc2hvcnRjdXQgd291bGQgaW5jb3JyZWN0 bHkgc2tpcCB0aGUgcmV3aW5kIGluIHRoaXMKKyMgY2FzZSwgbGVhdmluZyB0aGUgdGFyZ2V0J3Mg ZGl2ZXJnZWQgV0FMIGludGFjdC4KKyMKKyMgICBvcmlnaW4gKFRMSSAxKQorIyAgICAgICB8Cisj ICAgICAgICstLS0gbm9kZV9hIChUTEkgMSkgLS1wcm9tb3RlLS0+IFRMSSAyLCBVVUlELUEgICh0 YXJnZXQpCisjICAgICAgIHwKKyMgICAgICAgKy0tLSBub2RlX2IgKFRMSSAxKSAtLXByb21vdGUt LT4gVExJIDIsIFVVSUQtQiAgKHNvdXJjZSkKKyMKKyMgcGdfcmV3aW5kIG11c3QgZGV0ZWN0IHRo ZSBVVUlEIG1pc21hdGNoIGFuZCByZXdpbmQgbm9kZV9hIHRvIG1hdGNoIG5vZGVfYi4KKworbXkg JG5vZGVfb3JpZ2luID0gc2V0dXBfb3JpZ2luKCdvcmlnaW4nKTsKKworIyBDcmVhdGUgbm9kZV9h IGFuZCBub2RlX2IgZnJvbSBzZXBhcmF0ZSBiYWNrdXBzIG9mIG9yaWdpbiBzbyB0aGF0IGVhY2gK KyMgaGFzIGl0cyBvd24gZGF0YSBkaXJlY3RvcnkgYW5kIHdpbGwgZ2VuZXJhdGUgYW4gaW5kZXBl bmRlbnQgVVVJRCBvbiBwcm9tb3Rpb24uCitteSAoJG5vZGVfYSwgJG5vZGVfYikgPQorICBzZXR1 cF9zdGFuZGJ5c19mcm9tX29yaWdpbigkbm9kZV9vcmlnaW4sICdub2RlX2EnLCAnbm9kZV9iJyk7 CisKKyMgV2FpdCBmb3IgYm90aCBzdGFuZGJ5cyB0byBjYXRjaCB1cCB0byBvcmlnaW4sIHRoZW4g c3RvcCBvcmlnaW4uICBBZnRlcgorIyB0aGlzIHBvaW50IHRoZSB0d28gc3RhbmRieXMgYXJlIGlz b2xhdGVkIGFuZCB3aWxsIHByb21vdGUgaW5kZXBlbmRlbnRseS4KK3N5bmNfc3RhbmRieXNfd2l0 aF9vcmlnaW4oJG5vZGVfb3JpZ2luLCAkbm9kZV9hLCAkbm9kZV9iKTsKKyRub2RlX29yaWdpbi0+ c3RvcDsKKworIyBQcm9tb3RlIGJvdGggc3RhbmRieXMuICBFYWNoIGxhbmRzIG9uIFRMSSAyIGJ1 dCBnZW5lcmF0ZXMgYSBkaXN0aW5jdCBVVUlELAorIyBzbyB0aGUgcmVzdWx0aW5nIGNsdXN0ZXJz IGFyZSBkaXZlcmdlZCBldmVuIHRob3VnaCB0aGV5IHNoYXJlIGEgdGltZWxpbmUgSUQuCiskbm9k ZV9hLT5wcm9tb3RlOworJG5vZGVfYi0+cHJvbW90ZTsKKworIyBJbnNlcnQgYSBkaXZlcmdlbnQg cm93IG9uIGVhY2ggc28gdGhlIHJld2luZCBoYXMgdmlzaWJsZSB3b3JrIHRvIGRvLgord3JpdGVf cmVjb3JkKCRub2RlX2EsICdpbiBBJyk7Cit3cml0ZV9yZWNvcmQoJG5vZGVfYiwgJ2luIEInKTsK KworcmV3aW5kX25vZGUoJG5vZGVfYSwgJG5vZGVfYiwKKwkncGdfcmV3aW5kIGRldGVjdHMgaW5k ZXBlbmRlbnQgc2FtZS1UTEkgcHJvbW90aW9ucycpOworCitteSAkcmVzdWx0ID0KKyAgJG5vZGVf YS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJTRUxFQ1QgdmFsIEZST00gdGJsIE9SREVSIEJZIHZh bCIpOworaXMoJHJlc3VsdCwgImluIEJcbm9yaWdpbiIsCisJJ3Jld291bmQgbm9kZSBoYXMgc291 cmNlIGRhdGEsIG5vdCBpdHMgb3duIGRpdmVyZ2VudCBkYXRhJyk7CisKKyRub2RlX2EtPnRlYXJk b3duX25vZGU7Ciskbm9kZV9iLT50ZWFyZG93bl9ub2RlOworJG5vZGVfb3JpZ2luLT50ZWFyZG93 bl9ub2RlOworCisjIFRlc3QgdGhhdCBwZ19yZXdpbmQgY29ycmVjdGx5IHJld2luZHMgYWNyb3Nz IGEgVExJIG1pc21hdGNoIGJ1cmllZCBpbiBhIHNoYXJlZAorIyBwcmVmaXggb2YgdGhlIHRpbWVs aW5lIGhpc3RvcnkuICBUaGUgdGFyZ2V0IGhhcyBnb25lIHRocm91Z2ggdGhyZWUgdGltZWxpbmVz CisjIChUTEkgMSAtPiBUTEkgMiAtPiBUTEkgMykgd2hpbGUgdGhlIHNvdXJjZSBpbmRlcGVuZGVu dGx5IHByb21vdGVkIGZyb20gVExJIDEKKyMgdG8gd2hhdCBpcyBudW1lcmljYWxseSBUTEkgMiBi dXQgd2l0aCBhIGRpZmZlcmVudCBVVUlEIChUTEkgMicpLiAgVGhlIGRlZXBlc3QKKyMgY29tbW9u IGFuY2VzdG9yIGlzIHRoZXJlZm9yZSBUTEkgMSwgYW5kIHBnX3Jld2luZCBtdXN0IHJld2luZCB0 aGUgdGFyZ2V0IGFsbAorIyB0aGUgd2F5IGJhY2sgdG8gdGhlIGVuZCBvZiBUTEkgMS4KKyMKKyMg ICBvcmlnaW4gKFRMSSAxKSAtLSstLSBub2RlX3ggLS1wcm9tb3RlLS0+IFRMSSAyIC0tIG5vZGVf YSAtLXByb21vdGUtLT4gVExJIDMKKyMgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKHRhcmdldDogVExJIDEtPlRMSSAyLT5UTEkgMykKKyMgICAg ICAgICAgICAgICAgICAgICstLSBub2RlX2IgLS1wcm9tb3RlLS0+IFRMSSAyJworIyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZTogVExJIDEtPlRMSSAy JykKKyMKKyMgZmluZENvbW1vbkFuY2VzdG9yVGltZWxpbmUgd2Fsa3MgZm9yd2FyZDogVExJIDEg ZW50cmllcyBtYXRjaCAoVVVJRD0wIG9uCisjIGJvdGggc2lkZXMpLCB0aGVuIFRMSSAyIHZzIFRM SSAyJyBtYXRjaCBvbiB0bGkgYW5kIGJlZ2luIGJ1dCBkaWZmZXIgb24KKyMgVVVJRCwgc2lnbmFs bGluZyBpbmRlcGVuZGVudCBwcm9tb3Rpb25zLiAgVGhlIGFsZ29yaXRobSB0aGVyZWZvcmUgYmFj a3MgdXAKKyMgdG8gVExJIDEgYXMgdGhlIGNvbW1vbiBhbmNlc3RvciBhbmQgc2V0cyB0aGUgZGl2 ZXJnZW5jZSBwb2ludCB0byB0aGUgZW5kCisjIG9mIFRMSSAxLgorCitteSAkbm9kZV9vcmlnaW4y ID0gc2V0dXBfb3JpZ2luKCdvcmlnaW4yJyk7CisKKyMgbm9kZV94IGFuZCBub2RlX2IyIGJvdGgg c3RhcnQgZnJvbSB0aGUgc2FtZSBUTEkgMSBiYXNlbGluZS4KK215ICgkbm9kZV94LCAkbm9kZV9i MikgPQorICBzZXR1cF9zdGFuZGJ5c19mcm9tX29yaWdpbigkbm9kZV9vcmlnaW4yLCAnbm9kZV94 JywgJ25vZGVfYjInKTsKKworIyBCb3RoIHN0YW5kYnlzIG11c3QgYmUgY2F1Z2h0IHVwIHRvIHRo ZSBzYW1lIExTTiBiZWZvcmUgb3JpZ2luIHN0b3BzLCBzbworIyB0aGF0IFRMSSAyIGFuZCBUTEkg MicgYm90aCBiZWdpbiBhdCB0aGUgc2FtZSBXQUwgcG9zaXRpb24uCitzeW5jX3N0YW5kYnlzX3dp dGhfb3JpZ2luKCRub2RlX29yaWdpbjIsICRub2RlX3gsICRub2RlX2IyKTsKKyRub2RlX29yaWdp bjItPnN0b3A7CisKKyMgUHJvbW90ZSBub2RlX3ggdG8gVExJIDIgKFVVSUQtWCkgYW5kIGluc2Vy dCBhIHJvdy4gIG5vZGVfYjIgaXMgc3RpbGwgb24KKyMgVExJIDEgYW5kIGhhcyBub3QgeWV0IHNl ZW4gYW55IFRMSSAyIFdBTC4KKyRub2RlX3gtPnByb21vdGU7Cit3cml0ZV9yZWNvcmQoJG5vZGVf eCwgJ3gnKTsKKworIyBCdWlsZCBub2RlX2EyIGFzIGEgc3RhbmRieSBvZiBub2RlX3gsIHRoZW4g cHJvbW90ZSBpdCB0byBUTEkgMy4KK215ICgkbm9kZV9hMikgPSBzZXR1cF9zdGFuZGJ5c19mcm9t X29yaWdpbigkbm9kZV94LCAnbm9kZV9hMicpOworCitzeW5jX3N0YW5kYnlzX3dpdGhfb3JpZ2lu KCRub2RlX3gsICRub2RlX2EyKTsKKyRub2RlX3gtPnN0b3A7CisKKyRub2RlX2EyLT5wcm9tb3Rl OworCisjIE5vdyBwcm9tb3RlIG5vZGVfYjIgaW5kZXBlbmRlbnRseSBmcm9tIFRMSSAxIHRvIFRM SSAyJyAoVVVJRC1CLCAhPSBVVUlELVgpLgorJG5vZGVfYjItPnByb21vdGU7Cit3cml0ZV9yZWNv cmQoJG5vZGVfYjIsICdiJyk7CisKKyMgUmV3aW5kIG5vZGVfYTIgKFRMSSAxLT5UTEkgMi0+VExJ IDMpIGZyb20gbm9kZV9iMiAoVExJIDEtPlRMSSAyJykgaW4KKyMgbG9jYWwgbW9kZS4gIFRoZSBy ZXdpbmQgbXVzdCByZWFjaCBiYWNrIHRvIHRoZSBlbmQgb2YgVExJIDEuCisjCisjIG5vZGVfYTIg d2FzIGluaXRpYWxpc2VkIGZyb20gYSBzdHJlYW1pbmcgYmFja3VwIG9mIG5vZGVfeCB0YWtlbiBh ZnRlcgorIyBub2RlX3ggaGFkIGFscmVhZHkgY29tcGxldGVkIHNlZ21lbnQgNCBvZiBUTEkgMjsg dGhhdCBzZWdtZW50IHRoZXJlZm9yZQorIyBkb2VzIG5vdCBhcHBlYXIgaW4gbm9kZV9hMidzIHBn X3dhbC4gIHBnX3Jld2luZCdzIGJhY2t3YXJkIHNjYW4gZm9yIHRoZQorIyBsYXN0IGNoZWNrcG9p bnQgYmVmb3JlIHRoZSBkaXZlcmdlbmNlIHBvaW50IG5lZWRzIHRoYXQgc2VnbWVudCwgc28gd2UK KyMgcG9pbnQgcmVzdG9yZV9jb21tYW5kIGF0IG5vZGVfeCdzIHBnX3dhbCBhbmQgdXNlIC0tcmVz dG9yZS10YXJnZXQtd2FsLgorIworIyBOb3RlOiBubyByb3cgaXMgaW5zZXJ0ZWQgb24gVExJIDMu ICBUaGlzIGlzIGludGVudGlvbmFsOiB0aGUgb25seQorIyBwb3N0LWRpdmVyZ2VuY2UgdGFibGUg bW9kaWZpY2F0aW9uIGluIHRoZSB0YXJnZXQncyBXQUwgaXMgdGhlICd4JyBJTlNFUlQKKyMgb24g VExJIDIuICBPbiB1bnBhdGNoZWQgY29kZSB0aGUgV0FMIHNjYW4gd291bGQgc3RhcnQgZnJvbSB0 aGUgVExJIDIKKyMgc2h1dGRvd24gY2hlY2twb2ludCAoanVzdCBiZWZvcmUgVExJIDMpLCBtaXNz IHRoYXQgZWFybGllciBpbnNlcnQsIGFuZAorIyBsZWF2ZSAneCcgaW4gcGxhY2UgaW5zdGVhZCBv ZiByZXBsYWNpbmcgaXQgd2l0aCAnYicuCitteSAkbm9kZV94X3dhbGRpciA9ICRub2RlX3gtPmRh dGFfZGlyIC4gIi9wZ193YWwiOworJG5vZGVfYTItPmFwcGVuZF9jb25mKCdwb3N0Z3Jlc3FsLmNv bmYnLAorCSJyZXN0b3JlX2NvbW1hbmQgPSAnY3AgXCIkbm9kZV94X3dhbGRpci8lZlwiIFwiJXBc IidcbiIpOworCityZXdpbmRfbm9kZSgkbm9kZV9hMiwgJG5vZGVfYjIsCisJJ3BnX3Jld2luZCBy ZXdpbmRzIGFjcm9zcyBtaXNtYXRjaGVkIFRMSSAyIC8gVExJIDItcHJpbWUgdG8gVExJIDEnLAor CSctLXJlc3RvcmUtdGFyZ2V0LXdhbCcpOworbXkgJHJlc3VsdDIgPQorICAkbm9kZV9hMi0+c2Fm ZV9wc3FsKCdwb3N0Z3JlcycsICJTRUxFQ1QgdmFsIEZST00gdGJsIE9SREVSIEJZIHZhbCIpOwor aXMoJHJlc3VsdDIsICJiXG5vcmlnaW4yIiwKKwkncmV3b3VuZCBub2RlIHJlZmxlY3RzIHNvdXJj ZSBoaXN0b3J5LCBub3QgdGFyZ2V0IFRMSSAyL1RMSSAzIGRhdGEnKTsKKworJG5vZGVfYTItPnRl YXJkb3duX25vZGU7Ciskbm9kZV9iMi0+dGVhcmRvd25fbm9kZTsKKyRub2RlX3gtPnRlYXJkb3du X25vZGU7Ciskbm9kZV9vcmlnaW4yLT50ZWFyZG93bl9ub2RlOworCisjIFRlc3QgdGhhdCBwZ19y ZXdpbmQgY29ycmVjdGx5IGRldGVjdHMgYSBtaXNtYXRjaCB3aGVuIG9uZSBjbHVzdGVyJ3MgVExJ IDIKKyMgaGlzdG9yeSBlbnRyeSBjYXJyaWVzIGEgemVybyBVVUlEIChvbGQtZm9ybWF0IGhpc3Rv cnkgZmlsZSkgd2hpbGUgdGhlIG90aGVyCisjIGNhcnJpZXMgYSByZWFsIFVVSUQuICBUaGUgdHdv IGNsdXN0ZXJzIG11c3QgaGF2ZSBwcm9tb3RlZCBpbmRlcGVuZGVudGx5LCBzbworIyBwZ19yZXdp bmQgbXVzdCByZXdpbmQgdG8gVExJIDEgcmF0aGVyIHRoYW4gYWNjZXB0aW5nIHRoZSBzYW1lLVRM SSBzaG9ydGN1dC4KKyMKKyMgUnVuIGJvdGggb3JpZW50YXRpb25zOgorIyAgIChhKSB0YXJnZXQg aGFzIHplcm8gVVVJRCwgc291cmNlIGhhcyByZWFsIFVVSUQKKyMgICAoYikgdGFyZ2V0IGhhcyBy ZWFsIFVVSUQsIHNvdXJjZSBoYXMgemVybyBVVUlECisjCisjIEluIGJvdGggY2FzZXMgdGhlIHNl dHVwIGlzOgorIworIyAgIG9yaWdpbiAoVExJIDEpIC0tKy0tIG5vZGVfcCAtLXByb21vdGUtLT4g VExJIDIsIFVVSUQtUCAgKHRhcmdldCkKKyMgICAgICAgICAgICAgICAgICAgIHwKKyMgICAgICAg ICAgICAgICAgICAgICstLSBub2RlX3EgLS1wcm9tb3RlLS0+IFRMSSAyLCBVVUlELVEgIChzb3Vy Y2UpCisjCisjIE9uZSBzaWRlIHRoZW4gaGFzIGl0cyBoaXN0b3J5IGZpbGUgcmV3cml0dGVuIHRv IHRoZSBvbGQgMy1maWVsZCBmb3JtYXQgc28KKyMgdGhhdCBpdHMgVVVJRCByZWFkcyBhcyB6ZXJv LiAgcGdfcmV3aW5kIG11c3QgdHJlYXQgemVyby12cy1ub256ZXJvIGFzCisjIGluY29tcGF0aWJs ZSAodGhleSBjYW5ub3QgYmUgdGhlIHNhbWUgcHJvbW90aW9uKSBhbmQgcmV3aW5kIHRvIFRMSSAx LgorCitmb3IgbXkgJHN0cmlwX3RhcmdldCAoMSwgMCkKK3sKKwlteSAkemVyb19zaWRlID0gJHN0 cmlwX3RhcmdldCA/ICd0YXJnZXQnIDogJ3NvdXJjZSc7CisJbXkgJHJlYWxfc2lkZSA9ICRzdHJp cF90YXJnZXQgPyAnc291cmNlJyA6ICd0YXJnZXQnOworCW15ICRzZnggPSAkc3RyaXBfdGFyZ2V0 ID8gJ3p0JyA6ICd6cyc7CisJbXkgJGxhYmVsID0KKwkgICJwZ19yZXdpbmQgcmV3aW5kcyB3aGVu ICR6ZXJvX3NpZGUgaGFzIHplcm8gVVVJRCBhbmQgJHJlYWxfc2lkZSBoYXMgcmVhbCBVVUlEIjsK KworCW15ICRub2RlX29yaWdpbjMgPSBzZXR1cF9vcmlnaW4oIm9yaWdpbjNfJHNmeCIpOworCW15 ICgkbm9kZV9wLCAkbm9kZV9xKSA9CisJICBzZXR1cF9zdGFuZGJ5c19mcm9tX29yaWdpbigkbm9k ZV9vcmlnaW4zLCAibm9kZV9wXyRzZngiLCAibm9kZV9xXyRzZngiKTsKKworCXN5bmNfc3RhbmRi eXNfd2l0aF9vcmlnaW4oJG5vZGVfb3JpZ2luMywgJG5vZGVfcCwgJG5vZGVfcSk7CisJJG5vZGVf b3JpZ2luMy0+c3RvcDsKKworCSRub2RlX3AtPnByb21vdGU7CisJJG5vZGVfcS0+cHJvbW90ZTsK KworCXdyaXRlX3JlY29yZCgkbm9kZV9wLCAnaW4gUCcpOworCXdyaXRlX3JlY29yZCgkbm9kZV9x LCAnaW4gUScpOworCisJIyBTdHJpcCBVVUlEIGZyb20gdGhlIGNob3NlbiBzaWRlIHRvIHNpbXVs YXRlIGEgcHJlLVVVSUQgc2VydmVyLgorCXN0cmlwX3RsaV91dWlkKCRzdHJpcF90YXJnZXQgPyAk bm9kZV9wIDogJG5vZGVfcSwgMik7CisKKwlyZXdpbmRfbm9kZSgkbm9kZV9wLCAkbm9kZV9xLCAk bGFiZWwpOworCW15ICRyZXN1bHQzID0KKwkgICRub2RlX3AtPnNhZmVfcHNxbCgncG9zdGdyZXMn LCAiU0VMRUNUIHZhbCBGUk9NIHRibCBPUkRFUiBCWSB2YWwiKTsKKwlpcyggJHJlc3VsdDMsCisJ CSJpbiBRXG5vcmlnaW4zXyRzZngiLAorCQkncmV3b3VuZCBub2RlIGhhcyBzb3VyY2UgZGF0YSwg bm90IGl0cyBvd24gZGl2ZXJnZW50IHJvdycpOworCisJJG5vZGVfcC0+dGVhcmRvd25fbm9kZTsK Kwkkbm9kZV9xLT50ZWFyZG93bl9ub2RlOworCSRub2RlX29yaWdpbjMtPnRlYXJkb3duX25vZGU7 Cit9CisKKyMgVGVzdCB0aGF0IHBnX3Jld2luZCBkZXRlY3RzIGluZGVwZW5kZW50IHByb21vdGlv bnMgdG8gVExJIDMgd2hlbiBib3RoCisjIGNsdXN0ZXJzIHNoYXJlIGEgY29tbW9uIFRMSSAxIC0+ IFRMSSAyIGhpc3RvcnkgKHNhbWUgVVVJRCkgYnV0IGluZGVwZW5kZW50bHkKKyMgcHJvbW90ZWQg ZnJvbSBUTEkgMiB0byBUTEkgMywgcHJvZHVjaW5nIGRpZmZlcmVudCBUTEkgMyBVVUlEcy4KKyMK KyMgICBvcmlnaW4gKFRMSSAxKSAtLS0gbm9kZV9taWQgLS1wcm9tb3RlLS0+IFRMSSAyLCBVVUlE LU0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwK KyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLSBu b2RlX2MgLS1wcm9tb3RlLS0+IFRMSSAzLCBVVUlELUMgICh0YXJnZXQpCisjICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0gbm9kZV9kIC0tcHJvbW90ZS0t PiBUTEkgMycsIFVVSUQtRCAgKHNvdXJjZSkKKyMKKyMgVGhlIHNhbWUtVExJIHNob3J0Y3V0IGNv bXBhcmVzIGVudHJ5W05lbnRyaWVzLTJdLnRsdXVpZCBvbiBlYWNoIHNpZGU7IHRoYXQKKyMgaXMg dGhlIFVVSUQgb2YgdGhlIFRMSSAzIHByb21vdGlvbiwgd2hpY2ggZGlmZmVycy4gIFRoZSBmdWxs IHJld2luZCBwYXRoCisjIHRoZW4gd2Fsa3MgdGhlIGhpc3RvcnkgZm9yd2FyZDogVExJIDEgbWF0 Y2hlcyAoc2FtZSB0bGkvYmVnaW4vVVVJRC1NIGF0CisjIGVudHJ5WzBdKSwgVExJIDIgYWxzbyBt YXRjaGVzIChzYW1lIHRsaS9iZWdpbjsgVVVJRC1NIGlzIHRoZSBzYW1lIG9uIGJvdGgKKyMgc2lk ZXMgYXQgZW50cnlbMF0pLCBidXQgVExJIDMgdnMgVExJIDMnIGRpZmZlciBhdCBlbnRyeVsxXSAo VVVJRC1DICE9IFVVSUQtRCksCisjIHNvIHRoZSBkaXZlcmdlbmNlIHBvaW50IGlzIHNldCB0byB0 aGUgZW5kIG9mIFRMSSAyLgorCitteSAkbm9kZV9vcmlnaW40ID0gc2V0dXBfb3JpZ2luKCdvcmln aW40Jyk7CitteSAoJG5vZGVfbWlkKSA9IHNldHVwX3N0YW5kYnlzX2Zyb21fb3JpZ2luKCRub2Rl X29yaWdpbjQsICdub2RlX21pZCcpOworCitzeW5jX3N0YW5kYnlzX3dpdGhfb3JpZ2luKCRub2Rl X29yaWdpbjQsICRub2RlX21pZCk7Ciskbm9kZV9vcmlnaW40LT5zdG9wOworCisjIFByb21vdGUg bm9kZV9taWQgdG8gVExJIDIgYW5kIGluc2VydCBhIHJvdyB0aGF0IGJvdGggVExJIDMgbm9kZXMg d2lsbCBzaGFyZS4KKyRub2RlX21pZC0+cHJvbW90ZTsKK3dyaXRlX3JlY29yZCgkbm9kZV9taWQs ICdtaWQnKTsKKworIyBub2RlX2MgYW5kIG5vZGVfZCBib3RoIHN0YXJ0IGFzIHN0YW5kYnlzIG9m IG5vZGVfbWlkIHNvIHRoZXkgc2hhcmUgdGhlIHNhbWUKKyMgVExJIDIgcHJvbW90aW9uIFVVSUQg KFVVSUQtTSkuCitteSAoJG5vZGVfYywgJG5vZGVfZCkgPQorICBzZXR1cF9zdGFuZGJ5c19mcm9t X29yaWdpbigkbm9kZV9taWQsICdub2RlX2MnLCAnbm9kZV9kJyk7CitzeW5jX3N0YW5kYnlzX3dp dGhfb3JpZ2luKCRub2RlX21pZCwgJG5vZGVfYywgJG5vZGVfZCk7Ciskbm9kZV9taWQtPnN0b3A7 CisKKyMgUHJvbW90ZSBib3RoIGluZGVwZW5kZW50bHk7IGVhY2ggZ2VuZXJhdGVzIGEgZGlzdGlu Y3QgVExJIDMgVVVJRC4KKyRub2RlX2MtPnByb21vdGU7Ciskbm9kZV9kLT5wcm9tb3RlOworCit3 cml0ZV9yZWNvcmQoJG5vZGVfYywgJ2MnKTsKK3dyaXRlX3JlY29yZCgkbm9kZV9kLCAnZCcpOwor CityZXdpbmRfbm9kZSgkbm9kZV9jLCAkbm9kZV9kLAorCSdwZ19yZXdpbmQgZGV0ZWN0cyBpbmRl cGVuZGVudCBUTEkgMyAvIFRMSSAzLXByaW1lIHByb21vdGlvbnMgc2hhcmluZyBUTEkgMicKKyk7 CitteSAkcmVzdWx0NCA9CisgICRub2RlX2MtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiU0VMRUNU IHZhbCBGUk9NIHRibCBPUkRFUiBCWSB2YWwiKTsKK2lzKCRyZXN1bHQ0LCAiZFxubWlkXG5vcmln aW40IiwKKwkncmV3b3VuZCBub2RlIGhhcyBzb3VyY2UgVExJIDMtcHJpbWUgZGF0YSwgbm90IGl0 cyBvd24gVExJIDMgZGF0YScpOworCiskbm9kZV9jLT50ZWFyZG93bl9ub2RlOworJG5vZGVfZC0+ dGVhcmRvd25fbm9kZTsKKyRub2RlX21pZC0+dGVhcmRvd25fbm9kZTsKKyRub2RlX29yaWdpbjQt PnRlYXJkb3duX25vZGU7CisKIGRvbmVfdGVzdGluZygpOwpkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9w Z19yZXdpbmQvdGltZWxpbmUuYyBiL3NyYy9iaW4vcGdfcmV3aW5kL3RpbWVsaW5lLmMKaW5kZXgg ZGRhMDZlYWEwYmMuLmI2NTAwNjA2YjI3IDEwMDY0NAotLS0gYS9zcmMvYmluL3BnX3Jld2luZC90 aW1lbGluZS5jCisrKyBiL3NyYy9iaW4vcGdfcmV3aW5kL3RpbWVsaW5lLmMKQEAgLTksOSArOSw0 MCBAQAogICovCiAjaW5jbHVkZSAicG9zdGdyZXNfZmUuaCIKIAorI2luY2x1ZGUgPGN0eXBlLmg+ CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKICNpbmNsdWRlICJhY2Nlc3MvdGltZWxpbmUuaCIKICNp bmNsdWRlICJwZ19yZXdpbmQuaCIKIAorLyoKKyAqIFBhcnNlIGEgVVVJRCBzdHJpbmcgaW4gc3Rh bmRhcmQgZGFzaGVkIGZvcm0gaW50byBhIHBnX3V1aWRfdC4KKyAqIFJldHVybnMgdHJ1ZSBvbiBz dWNjZXNzLCBmYWxzZSBpZiBzdHIgaXMgbm90IGEgdmFsaWQgVVVJRCBzdHJpbmcuCisgKi8KK3N0 YXRpYyBib29sCityZXdpbmRfcGFyc2VfdXVpZChjb25zdCBjaGFyICpzdHIsIHBnX3V1aWRfdCAq dXVpZCkKK3sKKwljb25zdCBjaGFyICpzcmMgPSBzdHI7CisKKwlmb3IgKGludCBpID0gMDsgaSA8 IFVVSURfTEVOOyBpKyspCisJeworCQljaGFyCQlidWZbM107CisKKwkJaWYgKCFpc3hkaWdpdCgo dW5zaWduZWQgY2hhcikgc3JjWzBdKSB8fAorCQkJIWlzeGRpZ2l0KCh1bnNpZ25lZCBjaGFyKSBz cmNbMV0pKQorCQkJcmV0dXJuIGZhbHNlOworCQlidWZbMF0gPSBzcmNbMF07CisJCWJ1ZlsxXSA9 IHNyY1sxXTsKKwkJYnVmWzJdID0gJ1wwJzsKKwkJdXVpZC0+ZGF0YVtpXSA9ICh1bnNpZ25lZCBj aGFyKSBzdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOworCQlzcmMgKz0gMjsKKwkJLyogc2tpcCBkYXNo IGF0IHBvc2l0aW9ucyBhZnRlciBieXRlcyAzLCA1LCA3LCA5IChpID09IDMsNSw3LDkpICovCisJ CWlmIChzcmNbMF0gPT0gJy0nICYmIChpID09IDMgfHwgaSA9PSA1IHx8IGkgPT0gNyB8fCBpID09 IDkpKQorCQkJc3JjKys7CisJfQorCXJldHVybiAoKnNyYyA9PSAnXDAnKTsKK30KKwogLyoKICAq IFRoaXMgaXMgY29weS1wYXN0ZWQgZnJvbSB0aGUgYmFja2VuZCByZWFkVGltZUxpbmVIaXN0b3J5 LCBtb2RpZmllZCB0bwogICogcmV0dXJuIGEgbWFsbG9jJ2QgYXJyYXkgYW5kIHRvIHdvcmsgd2l0 aG91dCBiYWNrZW5kIGZ1bmN0aW9ucy4KQEAgLTQ4LDYgKzc5LDcgQEAgcmV3aW5kX3BhcnNlVGlt ZUxpbmVIaXN0b3J5KGNoYXIgKmJ1ZmZlciwgVGltZUxpbmVJRCB0YXJnZXRUTEksIGludCAqbmVu dHJpZXMpCiAJCXVpbnQzMgkJc3dpdGNocG9pbnRfaGk7CiAJCXVpbnQzMgkJc3dpdGNocG9pbnRf bG87CiAJCWludAkJCW5maWVsZHM7CisJCWNoYXIJCXV1aWRfc3RyW1VVSURfU1RSX0xFTiArIDFd ID0gezB9OwogCiAJCWZsaW5lID0gYnVmcHRyOwogCQl3aGlsZSAoKmJ1ZnB0ciAmJiAqYnVmcHRy ICE9ICdcbicpCkBAIC02Niw3ICs5OCw4IEBAIHJld2luZF9wYXJzZVRpbWVMaW5lSGlzdG9yeShj aGFyICpidWZmZXIsIFRpbWVMaW5lSUQgdGFyZ2V0VExJLCBpbnQgKm5lbnRyaWVzKQogCQlpZiAo KnB0ciA9PSAnXDAnIHx8ICpwdHIgPT0gJyMnKQogCQkJY29udGludWU7CiAKLQkJbmZpZWxkcyA9 IHNzY2FuZihmbGluZSwgIiV1XHQlWC8lMDhYIiwgJnRsaSwgJnN3aXRjaHBvaW50X2hpLCAmc3dp dGNocG9pbnRfbG8pOworCQluZmllbGRzID0gc3NjYW5mKGZsaW5lLCAiJXVcdCVYLyUwOFhcdCUz NnMiLCAmdGxpLCAmc3dpdGNocG9pbnRfaGksCisJCQkJCQkgJnN3aXRjaHBvaW50X2xvLCB1dWlk X3N0cik7CiAKIAkJaWYgKG5maWVsZHMgPCAxKQogCQl7CkBAIC03NSw3ICsxMDgsNyBAQCByZXdp bmRfcGFyc2VUaW1lTGluZUhpc3RvcnkoY2hhciAqYnVmZmVyLCBUaW1lTGluZUlEIHRhcmdldFRM SSwgaW50ICpuZW50cmllcykKIAkJCXBnX2xvZ19lcnJvcl9kZXRhaWwoIkV4cGVjdGVkIGEgbnVt ZXJpYyB0aW1lbGluZSBJRC4iKTsKIAkJCWV4aXQoMSk7CiAJCX0KLQkJaWYgKG5maWVsZHMgIT0g MykKKwkJaWYgKG5maWVsZHMgPCAzKQogCQl7CiAJCQlwZ19sb2dfZXJyb3IoInN5bnRheCBlcnJv ciBpbiBoaXN0b3J5IGZpbGU6ICVzIiwgZmxpbmUpOwogCQkJcGdfbG9nX2Vycm9yX2RldGFpbCgi RXhwZWN0ZWQgYSB3cml0ZS1haGVhZCBsb2cgc3dpdGNocG9pbnQgbG9jYXRpb24uIik7CkBAIC05 OSw3ICsxMzIsMTQgQEAgcmV3aW5kX3BhcnNlVGltZUxpbmVIaXN0b3J5KGNoYXIgKmJ1ZmZlciwg VGltZUxpbmVJRCB0YXJnZXRUTEksIGludCAqbmVudHJpZXMpCiAJCWVudHJ5LT5lbmQgPSAoKHVp bnQ2NCkgKHN3aXRjaHBvaW50X2hpKSkgPDwgMzIgfCAodWludDY0KSBzd2l0Y2hwb2ludF9sbzsK IAkJcHJldmVuZCA9IGVudHJ5LT5lbmQ7CiAKLQkJLyogd2UgaWdub3JlIHRoZSByZW1haW5kZXIg b2YgZWFjaCBsaW5lICovCisJCS8qCisJCSAqIFBhcnNlIHRoZSBvcHRpb25hbCBVVUlEIGZpZWxk LiAgT2xkIGhpc3RvcnkgZmlsZXMgaGF2ZSB0aGUgcmVhc29uCisJCSAqIHN0cmluZyBpbiBmaWVs ZCA0OyBpdHMgZmlyc3Qgd29yZCBpcyBtdWNoIHNob3J0ZXIgdGhhbiBVVUlEX1NUUl9MRU4KKwkJ ICogc28gdGhlIGxlbmd0aCBjaGVjayBzYWZlbHkgZGlzdGluZ3Vpc2hlcyBvbGQgZnJvbSBuZXcg Zm9ybWF0LgorCQkgKi8KKwkJbWVtc2V0KCZlbnRyeS0+dGx1dWlkLCAwLCBzaXplb2YocGdfdXVp ZF90KSk7CisJCWlmIChuZmllbGRzID09IDQgJiYgc3RybGVuKHV1aWRfc3RyKSA9PSBVVUlEX1NU Ul9MRU4pCisJCQlyZXdpbmRfcGFyc2VfdXVpZCh1dWlkX3N0ciwgJmVudHJ5LT50bHV1aWQpOwog CX0KIAogCWlmIChlbnRyaWVzICYmIHRhcmdldFRMSSA8PSBsYXN0dGxpKQpAQCAtMTIzLDYgKzE2 Myw3IEBAIHJld2luZF9wYXJzZVRpbWVMaW5lSGlzdG9yeShjaGFyICpidWZmZXIsIFRpbWVMaW5l SUQgdGFyZ2V0VExJLCBpbnQgKm5lbnRyaWVzKQogCWVudHJ5LT50bGkgPSB0YXJnZXRUTEk7CiAJ ZW50cnktPmJlZ2luID0gcHJldmVuZDsKIAllbnRyeS0+ZW5kID0gSW52YWxpZFhMb2dSZWNQdHI7 CisJbWVtc2V0KCZlbnRyeS0+dGx1dWlkLCAwLCBzaXplb2YocGdfdXVpZF90KSk7CiAKIAkqbmVu dHJpZXMgPSBubGluZXM7CiAJcmV0dXJuIGVudHJpZXM7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVk ZS9hY2Nlc3MvdGltZWxpbmUuaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy90aW1lbGluZS5oCmluZGV4 IDk3ZjFkNjE5YzM1Li5jZGQ2NDJjOTRmMCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNz L3RpbWVsaW5lLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3RpbWVsaW5lLmgKQEAgLTEzLDYg KzEzLDcgQEAKIAogI2luY2x1ZGUgImFjY2Vzcy94bG9nZGVmcy5oIgogI2luY2x1ZGUgIm5vZGVz L3BnX2xpc3QuaCIKKyNpbmNsdWRlICJ1dGlscy91dWlkLmgiCiAKIC8qCiAgKiBBIGxpc3Qgb2Yg dGhlc2Ugc3RydWN0cyBkZXNjcmliZXMgdGhlIHRpbWVsaW5lIGhpc3Rvcnkgb2YgdGhlIHNlcnZl ci4gRWFjaApAQCAtMjIsOSArMjMsMTAgQEAKICAqIHBvaW50ZXJzIG9mIGFsbCB0aGUgZW50cmll cyBmb3JtIGEgY29udGlndW91cyBsaW5lIGZyb20gYmVnaW5uaW5nIG9mIHRpbWUKICAqIHRvIGlu ZmluaXR5LgogICovCi10eXBlZGVmIHN0cnVjdAordHlwZWRlZiBzdHJ1Y3QgVGltZUxpbmVIaXN0 b3J5RW50cnkKIHsKIAlUaW1lTGluZUlECXRsaTsKKwlwZ191dWlkX3QJdGx1dWlkOwkJCS8qIGZy b20gaGlzdG9yeSBmaWxlOyB6ZXJvIGlmIHVua25vd24gKi8KIAlYTG9nUmVjUHRyCWJlZ2luOwkJ CS8qIGluY2x1c2l2ZSAqLwogCVhMb2dSZWNQdHIJZW5kOwkJCS8qIGV4Y2x1c2l2ZSwgSW52YWxp ZFhMb2dSZWNQdHIgbWVhbnMgaW5maW5pdHkgKi8KIH0gVGltZUxpbmVIaXN0b3J5RW50cnk7CkBA IC0zMyw2ICszNSw3IEBAIGV4dGVybiBMaXN0ICpyZWFkVGltZUxpbmVIaXN0b3J5KFRpbWVMaW5l SUQgdGFyZ2V0VExJKTsKIGV4dGVybiBib29sIGV4aXN0c1RpbWVMaW5lSGlzdG9yeShUaW1lTGlu ZUlEIHByb2JlVExJKTsKIGV4dGVybiBUaW1lTGluZUlEIGZpbmROZXdlc3RUaW1lTGluZShUaW1l TGluZUlEIHN0YXJ0VExJKTsKIGV4dGVybiB2b2lkIHdyaXRlVGltZUxpbmVIaXN0b3J5KFRpbWVM aW5lSUQgbmV3VExJLCBUaW1lTGluZUlEIHBhcmVudFRMSSwKKwkJCQkJCQkJIGNvbnN0IHBnX3V1 aWRfdCAqbmV3VExVVUlELAogCQkJCQkJCQkgWExvZ1JlY1B0ciBzd2l0Y2hwb2ludCwgY2hhciAq cmVhc29uKTsKIGV4dGVybiB2b2lkIHdyaXRlVGltZUxpbmVIaXN0b3J5RmlsZShUaW1lTGluZUlE IHRsaSwgY2hhciAqY29udGVudCwgaW50IHNpemUpOwogZXh0ZXJuIHZvaWQgcmVzdG9yZVRpbWVM aW5lSGlzdG9yeUZpbGVzKFRpbWVMaW5lSUQgYmVnaW4sIFRpbWVMaW5lSUQgZW5kKTsKZGlmZiAt LWdpdCBhL3NyYy9pbmNsdWRlL2FjY2Vzcy94bG9nX2ludGVybmFsLmggYi9zcmMvaW5jbHVkZS9h Y2Nlc3MveGxvZ19pbnRlcm5hbC5oCmluZGV4IDU1NjYzZTZmNGFmLi4yMGEyZjM0NWZkMyAxMDA2 NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNzL3hsb2dfaW50ZXJuYWwuaAorKysgYi9zcmMvaW5j bHVkZS9hY2Nlc3MveGxvZ19pbnRlcm5hbC5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAi YWNjZXNzL3hsb2dkZWZzLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3hsb2dyZWFkZXIuaCIKICNpbmNs dWRlICJkYXRhdHlwZS90aW1lc3RhbXAuaCIKKyNpbmNsdWRlICJ1dGlscy91dWlkLmgiCiAjaW5j bHVkZSAibGliL3N0cmluZ2luZm8uaCIKICNpbmNsdWRlICJwZ3RpbWUuaCIKICNpbmNsdWRlICJz dG9yYWdlL2Jsb2NrLmgiCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91dGlscy91dWlkLmggYi9z cmMvaW5jbHVkZS91dGlscy91dWlkLmgKaW5kZXggNTcyZDhjZjRjMzYuLjY4MzlkZTJlMGIyIDEw MDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy91dWlkLmgKKysrIGIvc3JjL2luY2x1ZGUvdXRp bHMvdXVpZC5oCkBAIC0xNywxMiArMTcsMTYgQEAKIC8qIHV1aWQgc2l6ZSBpbiBieXRlcyAqLwog I2RlZmluZSBVVUlEX0xFTiAxNgogCisvKiBsZW5ndGggb2YgYSBVVUlEIHN0cmluZyAod2l0aG91 dCBudWxsIHRlcm1pbmF0b3IpOiB4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHgg Ki8KKyNkZWZpbmUgVVVJRF9TVFJfTEVOIDM2CisKIHR5cGVkZWYgc3RydWN0IHBnX3V1aWRfdAog ewogCXVuc2lnbmVkIGNoYXIgZGF0YVtVVUlEX0xFTl07CiB9IHBnX3V1aWRfdDsKIAotLyogZm1n ciBpbnRlcmZhY2UgbWFjcm9zICovCisvKiBmbWdyIGludGVyZmFjZSBtYWNyb3MgKGJhY2tlbmQg b25seSkgKi8KKyNpZm5kZWYgRlJPTlRFTkQKIHN0YXRpYyBpbmxpbmUgRGF0dW0KIFVVSURQR2V0 RGF0dW0oY29uc3QgcGdfdXVpZF90ICpYKQogewpAQCAtMzgsNSArNDIsOSBAQCBEYXR1bUdldFVV SURQKERhdHVtIFgpCiB9CiAKICNkZWZpbmUgUEdfR0VUQVJHX1VVSURfUChYKQkJRGF0dW1HZXRV VUlEUChQR19HRVRBUkdfREFUVU0oWCkpCisjZW5kaWYJCQkJCQkJLyogIUZST05URU5EICovCisK K2V4dGVybiBwZ191dWlkX3QgKmdlbmVyYXRlX3V1aWR2Nyh1aW50NjQgdW5peF90c19tcywgdWlu dDMyIHN1Yl9tcyk7CitleHRlcm4gcGdfdXVpZF90ICpnZW5lcmF0ZV91dWlkdjdfcihwZ191dWlk X3QgKnV1aWQsIHVpbnQ2NCB1bml4X3RzX21zLCB1aW50MzIgc3ViX21zKTsKIAogI2VuZGlmCQkJ CQkJCS8qIFVVSURfSCAqLwotLSAKMi40My4wCgo= --000000000000e5fcc00652baa346--