X-Authentication-Warning: delorie.com: mail set sender to geda-user-bounces using -f X-Recipient: geda-user AT delorie DOT com X-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=fkOmakAbUQ/4VF+IRvn4CzAsJibqU1Vtlh10HLfH8BU=; b=ljsxpM9h7qGZryMHxzWs1PP4t20xVf9Fs6sga6riWW4gcxSkmf+mu71VBMQzuW9om4 1w5VgGmx/xuaS0Owz7trDsJhuIlVL/gWQUEGOjicEEWDXwz3iEjAC3BUOK3AYwDKvLCP 6/9TlYAw3qcvw9BNjdNyIHnrJHZOq8hI28ZaHvxzAtep2pv7DosWv/PIP4UNCjyZz5FS 419yzklJO0oOVBMiTc7McD1VvexQgzy8USakzi55sDCjX+8hC20holeOaJhUXmViptur T9CizOZmgeX/VNtiK1Cd4x4IWVijQHsqbbDnwWkcw+jkDp2sUPzrht9ktYuOF2iMrg4k EVRw== MIME-Version: 1.0 X-Received: by 10.194.8.227 with SMTP id u3mr32124370wja.38.1446590042327; Tue, 03 Nov 2015 14:34:02 -0800 (PST) Date: Tue, 3 Nov 2015 13:34:02 -0900 Message-ID: Subject: [geda-user] geometry.h From: "Britton Kerin (britton DOT kerin AT gmail DOT com) [via geda-user AT delorie DOT com]" To: geda-user AT delorie DOT com Content-Type: multipart/mixed; boundary=047d7b5d9c079c58e60523aa7d49 Reply-To: geda-user AT delorie DOT com --047d7b5d9c079c58e60523aa7d49 Content-Type: multipart/alternative; boundary=047d7b5d9c079c58e20523aa7d47 --047d7b5d9c079c58e20523aa7d47 Content-Type: text/plain; charset=UTF-8 I just pushed the latest to home/bkerin/geometry_module_2. I'm attaching them also for Igor It's pretty usable now, giving good results in improving intersection tests particularly for arcs. There are some things I'm uncertain about: 1. Would it be worth adding Union type and doing generic intersection tests there instead of scattered elsewhere? Pros: consolidate ad-hoc union-and-test operations in one place Cons: would need external type marks, miss geometrical short-cuts for some constructs 2. Would it be worth parameterizing for coordinate types? So could have a wrapper header and #define GEOM_COORD Coord or so. I guess this is mainly for Igor, but it would be nice to have geometry.h have only math and nothing pcb-specific. The thing with this is I use double for e.g. square-of-Coord and I'm not sure how to usefully and comprehensibly parameterize that sort of thing --047d7b5d9c079c58e20523aa7d47 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

I just pushed the latest to home/bkeri= n/geometry_module_2.=C2=A0 I'm attaching them also for Igor

It's pretty usable now, giving good= results in improving intersection tests particularly for arcs.

There are some things I'm uncertain= about:

1.=C2=A0 Would it be= worth adding Union type and doing generic intersection tests there instead= of
=C2=A0 =C2=A0 scattered elsewhere? =C2=A0

=C2=A0 =C2=A0 =C2=A0 =C2=A0Pros: con= solidate ad-hoc union-and-test operations in one place
=C2=A0 =C2=A0 =C2=A0 =C2=A0Cons: would need external type marks, miss geom= etrical short-cuts for some constructs

2.=C2=A0 Would it be worth parameterizing for coordinate types?= =C2=A0 So could have a wrapper header and=C2=A0
=C2=A0= =C2=A0 =C2=A0#define GEOM_COORD Coord or so.=C2=A0 I guess this is mainly = for Igor, but it would be nice to have
=C2=A0 =C2=A0 = =C2=A0geometry.h have only math and nothing pcb-specific.=C2=A0 The thing w= ith this is I use double for e.g.
=C2=A0 =C2=A0 =C2=A0= square-of-Coord and I'm not sure how to usefully and comprehensibly par= ameterize that sort
=C2=A0 =C2=A0 =C2=A0of thing
=


--047d7b5d9c079c58e20523aa7d47-- --047d7b5d9c079c58e60523aa7d49 Content-Type: text/x-chdr; charset=US-ASCII; name="geometry.h" Content-Disposition: attachment; filename="geometry.h" Content-Transfer-Encoding: base64 X-Attachment-Id: f_igjxaf2n0 Ly8gU2ltcGxlIDJEIGdlb21ldHJpY2FsIHR5cGVzIChlLmcuIHZlY3RvciwgbGluZSwgY2lybGUs IGVsbGlwc2UsIGFyYykKLy8gYW5kIHJlbGF0ZWQgdGVzdHMgYW5kIG1ldGhvZHMuCgojaWZuZGVm CVBDQl9HRU9NRVRSWV9ICiNkZWZpbmUJUENCX0dFT01FVFJZX0gKCiNpbmNsdWRlICJnbG9iYWwu aCIKCnR5cGVkZWYgc3RydWN0IHsKICBDb29yZCB4LCB5Owp9IFZlYzsKCnR5cGVkZWYgc3RydWN0 IHsKICBWZWMgcGEsIHBiOwp9IExpbmVTZWdtZW50OwoKdHlwZWRlZiBzdHJ1Y3QgewogIC8vIGNv cm5lclswXSBpcyBkaWFnb25hbCB0byBjb3JuZXJbMl0sIGNvcm5lclsxXSBpcyBkaWFnb25hbCB0 byBjb3JuZXJbM10KICBWZWMgY29ybmVyWzRdOwp9IFJlY3RhbmdsZTsKCnR5cGVkZWYgc3RydWN0 IHsKICBWZWMgY2VudGVyOwogIENvb3JkIHJhZGl1czsKfSBDaXJjbGU7Cgp0eXBlZGVmIHN0cnVj dCB7CiAgQ2lyY2xlIGNpcmNsZTsKICBkb3VibGUgc3RhcnRfYW5nbGU7ICAgLy8gTWVhc3Vpbmcg ZnJvbSAreCB0b3dhcmRzICt5LCBpbiBbMCwgMiBwaSkKICBkb3VibGUgYW5nbGVfZGVsdGE7ICAg Ly8gTWVhc3VpbmcgZnJvbSAreCB0b3dhcmRzICt5LCBpbiBbMCwgMiBwaSkKfSBBcmM7Cgpkb3Vi bGUKdmVjX21hZyAoVmVjIHZlYyk7CgovLyBSZXR1cm4gdmVjIHNjYWxlZCBieSBzY2FsZV9mYWN0 b3IuICBOb3RlIHRoYXQgc2NhbGluZyBpbnRlZ2VyIHZlY3RvcnMKLy8gdG8gc21hbGwgbWFnbml0 dWRlcyBjYW4gcmVzdWx0IGluIGEgbG90IG9mIGVycm9yLiAgVHJ5aW5nIHRvIG1ha2UgdW5pdAov LyB2ZWN0b3JzIHdvbid0IHdvcmsgZm9yIHRoaXMgcmVhc29uLgpWZWMKdmVjX3NjYWxlIChWZWMg dmVjLCBkb3VibGUgc2NhbGVfZmFjdG9yKTsKCi8vIFJldHVybiB2ZWMgZXh0ZW5kZWQgYnkgZGlz dGFuY2UuICBMaWtlIHZlY19zY2FsZSgpLCBidXQgYWRkaXRpdmUuClZlYwp2ZWNfZXh0ZW5kIChW ZWMgdmVjLCBkb3VibGUgZGlzdGFuY2UpOwoKVmVjCnZlY19zdW0gKFZlYyB2YSwgVmVjIHZiKTsK Ci8vIFJldHVybiB2ZWN0b3IgZnJvbSB2YSB0byB2YiwgYWthICh2YiAtIHZhKQpWZWMKdmVjX2Zy b20gKFZlYyB2YSwgVmVjIHZiKTsKCmRvdWJsZQp2ZWNfZG90IChWZWMgdmEsIFZlYyB2Yik7Cgov LyBSZXR1cm4gcHJvamVjdGlvbiBvZiB2YSBvbnRvIHZiLiAgUHJvamVjdGluZyBvbnRvIGEgdmVj dG9yIG9mIHplcm8KLy8gbWFnbml0dWRlIHdpbGwgcmVzdWx0IGluIGEgZGl2aWRlLWJ5LXplcm8g ZXJyb3IuClZlYwp2ZWNfcHJvaiAoVmVjIHZhLCBWZWMgdmIpOwoKLy8gUmV0dXJuIGFuZ2xlIG5v cm1hbGl6ZWQgaW50byB0aGUgWzAsIDIgcGkpIHJhbmdlLgpkb3VibGUKbm9ybWFsaXplX2FuZ2xl X2luX3JhZGlhbnMgKGRvdWJsZSBhbmdsZSk7CgovLyBSZXR1cm4gdHJ1ZSBpZmYgdGhldGEgaXMg YmV0d2VlbiBzdGFydF9hbmdsZSBhbmQgc3RhcnRfYW5nbGUgKyBhbmdsZV9kZWx0YQovLyBpbiBy YWRpYW5zICh3aW5kaW5nIHBvc2l0aXZlIGFuZ2xlcyBmcm9tICt4IHRvd2FyZHMgK3kpLgpib29s CmFuZ2xlX2luX3NwYW4gKGRvdWJsZSB0aGV0YSwgZG91YmxlIHN0YXJ0X2FuZ2xlLCBkb3VibGUg YW5nbGVfZGVsdGEpOwoKLy8gUmV0dXJuIHRydWUgaWZmIHB0IGlzIGluIHJlY3QgKHdpdGggcmVj dCByZWdhcmRlZCBhcyBmaWxsZWQpLgpib29sCnBvaW50X2ludGVyc2VjdHNfcmVjdGFuZ2xlIChW ZWMgcHQsIFJlY3RhbmdsZSBjb25zdCAqcmVjdCk7CgovLyBSZXR1cm4gdHJ1ZSBpZmYgcHQgaXMg aW4gY2lyYyAod2l0aCBjaXJjIHJlZ2FyZGVkIGFzIGZpbGxlZCkuCmJvb2wKcG9pbnRfaW50ZXJz ZWN0c19jaXJjbGUgKFZlYyBwdCwgQ2lyY2xlIGNvbnN0ICpjaXJjKTsKCi8vIFJldHVybiB0aGUg cG9pbnQgb24gc2VnIGNsb3Nlc3QgdG8gcHQuClZlYwpuZWFyZXN0X3BvaW50X29uX2xpbmVfc2Vn bWVudCAoVmVjIHB0LCBMaW5lU2VnbWVudCBjb25zdCAqc2VnKTsKCi8vIFJldHVybiB0aGUgcG9p bnQgb24gQXJjIGNsb3Nlc3QgdG8gcHQuClZlYwpuZWFyZXN0X3BvaW50X29uX2FyYyAoVmVjIHB0 LCBBcmMgY29uc3QgKmFyYyk7CgovLyBSZXR1cm4gdHJ1ZSBpZmYgZmlsbGVkIGNpcmNsZSBpbnRl cnNlY3RzIHNlZy4gIElmIHBpaSAoUG9pbnQgSW4KLy8gSW50ZXJzZWN0aW9uKSBpcyBub3QgTlVM TCwgc2V0ICpwaWkgdG8gYSBwb2ludCBpbiB0aGUgaW50ZXJzZWN0aW9uLgovLyBOb3RlIHRoYXQg aXQncyBjb25zaWRlcmVkIGFuIGludGVyc2VjdGlvbiBpZiBzZWcgbGllcyBlbnRpcmVseSBpbnNp ZGUgY2lyYy4KYm9vbApjaXJjbGVfaW50ZXJzZWN0c19saW5lX3NlZ21lbnQgKAogICAgQ2lyY2xl ICAgICAgY29uc3QgKmNpcmMsCiAgICBMaW5lU2VnbWVudCBjb25zdCAqc2VnLAogICAgVmVjICAg ICAgICAgICAgICAgKnBpaSApOwoKLy8gUmV0dXJuIHRydWUgaWZmIGZpbGxlZCBjaXJjIGludGVy c2VjdHMgZmlsbGVkIHJlY3QuICBJZiBhbiBpbnRlcnNlY3Rpb24KLy8gaXMgZm91bmQgYW5kIHBp aSAoUG9pbnQgSW4gSW50ZXJzZWN0aW9uKSBpcyBub3QgTlVMTCwgcmV0dXJuIGEgcG9pbnQgaW4K Ly8gdGhlIGludGVyc2VjdGlvbiBpbiBwaWkuICBOb3RlIHRoYXQgaXQncyBjb25zaWRlcmVkIGFu IGludGVyc2VjdGlvbiBpZgovLyBvbmUgZmlndXJlIGxpZXMgZW50aXJlbHkgaW5zaWRlIHRoZSBv dGhlci4KYm9vbApjaXJjbGVfaW50ZXJzZWN0c19yZWN0YW5nbGUgKAogICAgQ2lyY2xlICAgIGNv bnN0ICpjaXJjLAogICAgUmVjdGFuZ2xlIGNvbnN0ICpyZWN0LAogICAgVmVjICAgICAgICAgICAg ICpwaWkgKTsKCi8vIFJldHVybiB0cnVlIGlmZiBmaWxsZWQgY2lyY2xlcyBjYSBhbmQgY2IgaW50 ZXJzZWN0LiAgSWYgcGlpIChQb2ludAovLyBJbiBJbnRlcnNlY3Rpb24pIGlzIG5vdCBOVUxMLCBz ZXQgKnBpaSB0byBhIHBvaW50IGluIHRoZSBpbnRlcnNlY3Rpb24KLy8gKHRyZWF0aW5nIHRoZSBj aXJjbGVzIGFzIGZpbGxlZCkuCmJvb2wKY2lyY2xlX2ludGVyc2VjdHNfY2lyY2xlICgKICAgIENp cmNsZSBjb25zdCAqY2EsCiAgICBDaXJjbGUgY29uc3QgKmNiLAogICAgVmVjICAgICAgICAgICpw aWkgKTsKCi8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgaW50ZXJzZWN0aW9u IG9mIGNpcmMgYW5kIHNlZyAoMCwgMSwKLy8gb3IgMiksIGFzc3VtaW5nIG5vIGZsb2F0aW5nIHBv aW50IHByb2JsZW1zLiAgVGhpcyBmdW5jdGlvbiB2aWV3cyBjaXJjIGFzCi8vIHVuZmlsbGVkOiBp ZiBzZWcgbGllcyBlbnRpcmVseSBpbnNpZGUgY2lyYyBubyBpbnRlcnNlY3Rpb24gd2lsbCBiZSBm b3VuZC4KLy8gSWYgdGhlIHJlc3VsdCBpcyBub24temVybyBhbmQgaW50ZXJzZWN0aW9ucyBpcyBu b24tTlVMTCwgdGhlIGludGVyc2VjdGlvbgovLyBwb2ludChzKSBhcmUgcmV0dXJuZWQgdGhlcmUu ICBEZWdlbmVyYXRlICh6ZXJvIGxlbmd0aCkgc2VnIGFyZ3VtZW50cyBhcmUKLy8gdHJlYXRlZCBh cyBwb2ludHMuICBEZWdlbmVyYXRlIChyYWRpdXMgPD0gMCkgY2lyYyBhcmd1bWVudHMgYXJlbid0 IGFsbG93ZWQuCi8vIE5vdGUgdGhhdCBkZXRlY3Rpb24gb2YgdGhlIGludGVyc2VjdGlvbiBmb3Ig bGluZSBzZWdtZW50cyB0YW5nZW50IHRvIGNpcmMKLy8gaXMgc3ViamVjdCB0byByb3VuZGluZyBl cnJvciBhbmQgYSByZXN1bHQgb2YgMSBpcyBkb3VidGZ1bCBpbiB0aGlzIGNhc2UuCmludApjaXJj bGVfbGluZV9zZWdtZW50X2ludGVyc2VjdGlvbiAoCiAgICBDaXJjbGUgICAgICBjb25zdCAqY2ly YywKICAgIExpbmVTZWdtZW50IGNvbnN0ICpzZWcsCiAgICBWZWMgICAgICAgICAgICAgICAgaW50 ZXJzZWN0aW9uWzJdICk7CgovLyBSZXR1cm4gdGhlIGVuZCBwb2ludHMgb2YgYXJjIGluICplcC4g IEFyY3Mgc3Bhbm5pbmcgPiAyIHBpIHJhZGlhbnMgYXJlCi8vIHN0aWxsIGNvbnNpZGVyZWQgdG8g aGF2ZSBkaXN0aW5jdCBlbmQgcG9pbnRzLgp2b2lkCmFyY19lbmRfcG9pbnRzIChBcmMgKmFyYywg VmVjIGVwWzJdKTsKCi8vIExpa2UgY2lyY2xlX2xpbmVfc2VnbWVudF9pbnRlcnNlY3Rpb24oKSwg YnV0IGZvciBhbiBhcmMgb2YgYSBjaXJsZS4KaW50CmFyY19saW5lX3NlZ21lbnRfaW50ZXJzZWN0 aW9uICgKICAgIEFyYyAgICAgICAgIGNvbnN0ICphcmMsCiAgICBMaW5lU2VnbWVudCBjb25zdCAq c2VnLAogICAgVmVjICAgICAgICAgICAgICAgIGludGVyc2VjdGlvblsyXSApOwoKCiNlbmRpZiAg IC8vIFBDQl9HRU9NRVRSWV9ICg== --047d7b5d9c079c58e60523aa7d49 Content-Type: text/x-csrc; charset=US-ASCII; name="geometry.c" Content-Disposition: attachment; filename="geometry.c" Content-Transfer-Encoding: base64 X-Attachment-Id: f_igjxaiui1 Ly8gSW50ZXJmYWNlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXNjcmliZWQgaW4gZ2VvbWV0cnku aC4KCiNkZWZpbmUgX0dOVV9TT1VSQ0UKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPG1h dGguaD4KCiNpbmNsdWRlICJnZW9tZXRyeS5oIgoKZG91YmxlCnZlY19tYWcgKFZlYyB2ZWMpCnsK ICAvLyBGSVhNRTogdGhpcyBoaWRkZW4gcm91bmQgaXMgd2VpcmQsIHNob3VsZCBtYWtlIGNsaWVu dHMgZG8gaXQgYXQgbmVlZAogIHJldHVybiByb3VuZCAoaHlwb3QgKHZlYy54LCB2ZWMueSkpOwp9 CgpWZWMKdmVjX3NjYWxlIChWZWMgdmVjLCBkb3VibGUgc2NhbGVfZmFjdG9yKQp7CiAgVmVjIHJl c3VsdDsKCiAgcmVzdWx0LnggPSByb3VuZCAodmVjLnggKiBzY2FsZV9mYWN0b3IpOwogIHJlc3Vs dC55ID0gcm91bmQgKHZlYy55ICogc2NhbGVfZmFjdG9yKTsKCiAgcmV0dXJuIHJlc3VsdDsKfQoK VmVjCnZlY19leHRlbmQgKFZlYyB2ZWMsIGRvdWJsZSBkaXN0YW5jZSkKewogIC8vIEZJWE1FOiBJ J20gZGVhZCBzaW1wbGUgYnV0IG5vdCB0ZXN0ZWQgeWV0CgogIGRvdWJsZSBpbSA9IHZlY19tYWcg KHZlYyk7ICAgLy8gSW5pdGlhbCBNYWduaXR1ZGUKCiAgcmV0dXJuIHZlY19zY2FsZSAodmVjLCAo aW0gKyBkaXN0YW5jZSkgLyBpbSk7Cn0KClZlYwp2ZWNfc3VtIChWZWMgdmEsIFZlYyB2YikKewog IFZlYyByZXN1bHQ7CgogIHJlc3VsdC54ID0gdmEueCArIHZiLng7CiAgcmVzdWx0LnkgPSB2YS55 ICsgdmIueTsKCiAgcmV0dXJuIHJlc3VsdDsKfQoKVmVjCnZlY19mcm9tIChWZWMgdmEsIFZlYyB2 YikKewogIFZlYyByZXN1bHQgPSB7IHZiLnggLSB2YS54LCB2Yi55IC0gdmEueSB9OwogIAogIHJl dHVybiByZXN1bHQ7Cn0KCmRvdWJsZQp2ZWNfZG90IChWZWMgdmEsIFZlYyB2YikKewogIHJldHVy biAoKGRvdWJsZSkgdmEueCkgKiB2Yi54ICsgKChkb3VibGUpIHZhLnkpICogdmIueTsKfQoKVmVj CnZlY19wcm9qIChWZWMgdmEsIFZlYyB2YikKewogIHJldHVybiB2ZWNfc2NhbGUgKHZiLCB2ZWNf ZG90ICh2YSwgdmIpIC8gdmVjX2RvdCAodmIsIHZiKSk7Cn0KCmRvdWJsZQpub3JtYWxpemVfYW5n bGVfaW5fcmFkaWFucyAoZG91YmxlIGFuZ2xlKQp7CiAgd2hpbGUgKCBhbmdsZSA8IDAuMCApIHsK ICAgIGFuZ2xlICs9IDIuMCAqIE1fUEk7CiAgfQogIHdoaWxlICggYW5nbGUgPj0gMi4wICogTV9Q SSApIHsKICAgIGFuZ2xlIC09IDIuMCAqIE1fUEk7CiAgfQoKICByZXR1cm4gYW5nbGU7Cn0KCmJv b2wKYW5nbGVfaW5fc3BhbiAoZG91YmxlIHRoZXRhLCBkb3VibGUgc3RhcnRfYW5nbGUsIGRvdWJs ZSBhbmdsZV9kZWx0YSkKewogIGlmICggYW5nbGVfZGVsdGEgPiAwLjAgKSB7CiAgICByZXR1cm4g YW5nbGVfZGVsdGEgPj0gbm9ybWFsaXplX2FuZ2xlX2luX3JhZGlhbnMgKHRoZXRhIC0gc3RhcnRf YW5nbGUpOwogIH0KICBlbHNlIHsKICAgIHJldHVybiAtYW5nbGVfZGVsdGEgPj0gbm9ybWFsaXpl X2FuZ2xlX2luX3JhZGlhbnMgKC10aGV0YSArIHN0YXJ0X2FuZ2xlKTsKICB9Cn0KCmJvb2wKcG9p bnRfaW50ZXJzZWN0c19yZWN0YW5nbGUgKFZlYyBwdCwgUmVjdGFuZ2xlIGNvbnN0ICpyZWN0KQp7 CiAgLy8gRklYTUU6IHJvdGF0aW5nIGFuZCB0cmFuc2xhdGluZyBwb2ludCB0byBwdXQgcmVjdCBy ZWxhdGl2ZWx5IGF0IG9yaWdpbgogIC8vIG9yIGF0IGxlYXN0IGF4aXMtYWxpZ25lZCB3b3VsZCBi ZSBmYXN0ZXIKCiAgLy8gU2lkZXMgYXMgbGluZSBzZWdtZW50cwogIExpbmVTZWdtZW50IGMxX2My ID0geyByZWN0LT5jb3JuZXJbMF0sIHJlY3QtPmNvcm5lclsxXSB9OwogIExpbmVTZWdtZW50IGMy X2MzID0geyByZWN0LT5jb3JuZXJbMV0sIHJlY3QtPmNvcm5lclsyXSB9OwogIExpbmVTZWdtZW50 IGMzX2M0ID0geyByZWN0LT5jb3JuZXJbMl0sIHJlY3QtPmNvcm5lclszXSB9OwogIExpbmVTZWdt ZW50IGM0X2MxID0geyByZWN0LT5jb3JuZXJbM10sIHJlY3QtPmNvcm5lclswXSB9OwoKICAvLyBE aXN0YW5jZSBiZXR3ZWVuIHBhaXJzIG9mIG9wcG9zaXRlIHNpZGVzCiAgZG91YmxlIGRfYzFfYzJf dG9fYzNfYzQKICAgID0gdmVjX21hZyAodmVjX2Zyb20gKHJlY3QtPmNvcm5lclswXSwgcmVjdC0+ Y29ybmVyWzNdKSk7CiAgZG91YmxlIGRfYzJfYzNfdG9fYzRfYzEKICAgID0gdmVjX21hZyAodmVj X2Zyb20gKHJlY3QtPmNvcm5lclswXSwgcmVjdC0+Y29ybmVyWzFdKSk7CiAgIAogIC8vIE5lYXJl c3QgUG9pbnQgKHRvIHB0KSBPbiBTaWRlcwogIFZlYyBucG9fYzFfYzIgPSBuZWFyZXN0X3BvaW50 X29uX2xpbmVfc2VnbWVudCAocHQsICZjMV9jMik7CiAgVmVjIG5wb19jMl9jMyA9IG5lYXJlc3Rf cG9pbnRfb25fbGluZV9zZWdtZW50IChwdCwgJmMyX2MzKTsKICBWZWMgbnBvX2MzX2M0ID0gbmVh cmVzdF9wb2ludF9vbl9saW5lX3NlZ21lbnQgKHB0LCAmYzNfYzQpOwogIFZlYyBucG9fYzRfYzEg PSBuZWFyZXN0X3BvaW50X29uX2xpbmVfc2VnbWVudCAocHQsICZjNF9jMSk7CgogIC8vIERpc3Rh bmNlcyBmcm9tIHB0IHRvIG5lYXJlc3QgcG9pbnQgb24gZWFjaCBzaWRlCiAgZG91YmxlIGRfcHRf YzFfYzIgPSB2ZWNfbWFnICh2ZWNfZnJvbSAocHQsIG5wb19jMV9jMikpOwogIGRvdWJsZSBkX3B0 X2MyX2MzID0gdmVjX21hZyAodmVjX2Zyb20gKHB0LCBucG9fYzJfYzMpKTsKICBkb3VibGUgZF9w dF9jM19jNCA9IHZlY19tYWcgKHZlY19mcm9tIChwdCwgbnBvX2MzX2M0KSk7CiAgZG91YmxlIGRf cHRfYzRfYzEgPSB2ZWNfbWFnICh2ZWNfZnJvbSAocHQsIG5wb19jNF9jMSkpOwoKICByZXR1cm4g KAogICAgICBkX3B0X2MxX2MyIDw9IGRfYzFfYzJfdG9fYzNfYzQgJiYKICAgICAgZF9wdF9jM19j NCA8PSBkX2MxX2MyX3RvX2MzX2M0ICYmCiAgICAgIGRfcHRfYzJfYzMgPD0gZF9jMl9jM190b19j NF9jMSAmJgogICAgICBkX3B0X2M0X2MxIDw9IGRfYzJfYzNfdG9fYzRfYzEgKTsKfQoKYm9vbApw b2ludF9pbnRlcnNlY3RzX2NpcmNsZSAoVmVjIHB0LCBDaXJjbGUgY29uc3QgKmNpcmMpCnsKICAv LyBUcmFuc2xhdGUgcHQgc3QgY2lyYyBpcyByZWxhdGl2ZWx5IHNpdHVhdGVkIGF0IG9yaWdpbi4K ICBwdC54IC09IGNpcmMtPmNlbnRlci54OwogIHB0LnkgLT0gY2lyYy0+Y2VudGVyLnk7CgogIHJl dHVybiBoeXBvdCAocHQueCwgcHQueSkgPD0gY2lyYy0+cmFkaXVzOwp9CgpWZWMKbmVhcmVzdF9w b2ludF9vbl9saW5lX3NlZ21lbnQgKFZlYyBwdCwgTGluZVNlZ21lbnQgY29uc3QgKnNlZykKewog IC8vIEZJWE1FOiBJIGRvbid0IGRvIGFueXRoaW5nIGVmZmljaWVudCBmb3IgaG9yaXpvbnRhbC92 ZXJ0aWNhbCBsaW5lCiAgLy8gc2VnbWVudHMKCiAgLy8gRklYTUU6IFN0YWNrIG92ZXJmbG93IGhh cyBhIHNvbWV3aGF0IG1vcmUKICAvLyBlZmZpY2llbnQgc29sdXRpb24gdXNpbmcgc2FtZSBiYXNp YyBpZGVhOgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvODQ5MjExLwog IC8vIHNob3J0ZXN0LWRpc3RhbmNlLWJldHdlZW4tYS1wb2ludC1hbmQtYS1saW5lLXNlZ21lbnQK CiAgVmVjIHNwYV9zcGI7ICAgLy8gVmVjdG9yIGZyb20gc2VnbWVudCBwb2ludCBhIHRvIHBvaW50 IGIKICBWZWMgc3BhX3B0OyAgICAvLyBWZWN0b3IgZnJvbSBzZWdtZW50IHBvaW50IGEgdG8gcHQK ICBWZWMgcHRsOyAgICAgICAvLyBQcm9qZWN0aW9uIG9mIHB0IG9udG8gc2VnIHZlY3RvciAob250 byBzcGFfc3BiKQogIGRvdWJsZSBzbTsgICAgIC8vIFNlZ21lbnQgTWFnbml0dWRlCiAgZG91Ymxl IHBtOyAgICAgLy8gUHJvamVjdGlvbiBNYWduaXR1ZGUKICBWZWMgcHA7ICAgICAgICAvLyBQcm9q ZWN0ZWQgUG9pbnQKICBkb3VibGUgc3BwbTsgICAvLyBNYWduaXR1ZGUgc3BhX3NwYiArIHNwYV9w dCAoU2VnbWVudCBQbHVzIFByb2ouIE1hZy4pCiAgVmVjIHJlc3VsdDsgICAgLy8gUmVzdWx0IHRv IGJlIHJldHVybmVkCgogIC8vIERlZ2VuZXJhdGUgY2FzZTogc2VnIGlzIGEgcG9pbnQKICBpZiAo IHNlZy0+cGEueCA9PSBzZWctPnBiLnggJiYgc2VnLT5wYS55ID09IHNlZy0+cGIueSApIHsKICAg IHJlc3VsdC54ID0gc2VnLT5wYS54OwogICAgcmVzdWx0LnkgPSBzZWctPnBhLnk7CiAgICByZXR1 cm4gcmVzdWx0OwogIH0KCiAgc3BhX3NwYiA9IHZlY19mcm9tIChzZWctPnBhLCBzZWctPnBiKTsK ICBzcGFfcHQgID0gdmVjX2Zyb20gKHNlZy0+cGEsIHB0KTsKICBwdGwgICAgID0gdmVjX3Byb2og KHNwYV9wdCwgc3BhX3NwYik7CiAgc20gICAgICA9IHZlY19tYWcgKHNwYV9zcGIpOwogIHBtICAg ICAgPSB2ZWNfbWFnIChwdGwpOwogIHBwICAgICAgPSB2ZWNfc3VtIChzZWctPnBhLCBwdGwpOwog IHNwcG0gICAgPSB2ZWNfbWFnICh2ZWNfc3VtIChzcGFfc3BiLCBwdGwpKTsKICAKICBpZiAoIHNw cG0gPCBzbSB8fCBzcHBtIDwgcG0gKSB7CiAgICByZXR1cm4gc2VnLT5wYTsgIC8vIFNlZ21lbnQg KyBQcm9qZWN0aW9uIGFkZCBkZXNjdHJ1Y3RpdmVseSwgc28gZW5kIGEgCiAgfQogIGVsc2UgaWYg KCBwbSA+IHNtICkgewogICAgcmV0dXJuIHNlZy0+cGI7ICAvLyBQcm9qZWN0aW9uIGlzIHBhc3Qg b3RoZXIgZW5kIG9mIHNlZ21lbnQsIHNvIGVuZCBiCiAgfQogIGVsc2UgewogICAgcmV0dXJuIHBw OyAgICAgICAvLyBQcm9qZWN0aW9uIGxhbmRlZCBvbiBsaW5lLCBzbyBwcm9qZWN0ZWQgcG9pbnQK ICB9Cn0KClZlYwpuZWFyZXN0X3BvaW50X29uX2FyYyAoVmVjIHB0LCBBcmMgY29uc3QgKmFyYykK ewogIFZlYyBjZW50ID0gYXJjLT5jaXJjbGUuY2VudGVyOwogIENvb3JkIHJhZCA9IGFyYy0+Y2ly Y2xlLnJhZGl1czsKCiAgLy8gVHJhbnNsYXRlIHB0IHN0IEFyYyBjaXJjbGUgaXMgY2VudGVyZWQg YXQgb3JpZ2luIHdydCBpdAogIHB0LnggLT0gY2VudC54OwogIHB0LnkgLT0gY2VudC55OwoKICBk b3VibGUgc2EgPSBhcmMtPnN0YXJ0X2FuZ2xlOwogIGRvdWJsZSBhZCA9IGFyYy0+YW5nbGVfZGVs dGE7CiAgZG91YmxlIGVhID0gc2EgKyBhZDsgICAvLyBFbmQgQW5nbGUuICAgTm90ZTogaW4gWzAs IDQuMCAqIE1fUEkpCgogIC8vIE5lYXJlc3QgUG9pbnQgb24gQ2lyY2xlCiAgVmVjIG5wb2MgPSB2 ZWNfc2NhbGUgKHB0LCByYWQgLyB2ZWNfbWFnIChwdCkpOwoKICBkb3VibGUgdGhldGFfbnBvYyA9 IGF0YW4yIChucG9jLnksIG5wb2MueCk7CgogIFZlYyByZXN1bHQ7CgogIC8vIElmIHRoZSBuZWFy ZXN0IHBvaW50IG9uIHRoZSB1bmRlcmx5aW5nIGNpcmNsZSBpcyBwYXJ0IG9mIHRoZSBhcmMsCiAg Ly8gdGhlIHBvaW50IGl0c2VsZiBpcyB0aGUgcmVzdWx0IHdlIHdhbnQsIG90aGVyd2lzZSB0aGUg ZW5kIHBvaW50IG9mCiAgLy8gdGhlIGFyYyBjbG9zZXN0IHRvIHRoZSBuZWFyZXN0IHBvaW50IGlz IHRoZSBvbmUgd2Ugd2FudC4KICBpZiAoIGFuZ2xlX2luX3NwYW4gKHRoZXRhX25wb2MsIHNhLCBh ZCkgKSB7CiAgICByZXN1bHQgPSBucG9jOwogIH0KICBlbHNlIHsKICAgIC8vIFdlIHNob3VsZCB1 c2Ugc2luY29zKCkgaGVyZSB3aGVuIGl0IGJlY29tZXMgc3RhbmRhcmQKICAgIC8vIEVuZCBQb2lu dCBBLgogICAgVmVjIGVwYSA9IHsgcm91bmQgKHJhZCAqIGNvcyAoc2EpKSwgcm91bmQgKHJhZCAq IHNpbiAoc2EpKSB9OwogICAgLy8gRW5kIFBvaW50IEIKICAgIFZlYyBlcGIgPSB7IHJvdW5kIChy YWQgKiBjb3MgKGVhKSksIHJvdW5kIChyYWQgKiBzaW4gKGVhKSkgfTsKICAgIGRvdWJsZSBtX25w b2NfZXBhID0gdmVjX21hZyAodmVjX2Zyb20gKG5wb2MsIGVwYSkpOwogICAgZG91YmxlIG1fbnBv Y19lcGIgPSB2ZWNfbWFnICh2ZWNfZnJvbSAobnBvYywgZXBiKSk7CiAgICByZXN1bHQgID0gKG1f bnBvY19lcGEgPCBtX25wb2NfZXBiID8gZXBhIDogZXBiKTsKICB9CgogIC8vIFRyYW5zbGF0ZSBi YWNrIHRvIHRydWUgcG9zaXRpb24KICByZXN1bHQueCArPSBjZW50Lng7CiAgcmVzdWx0LnkgKz0g Y2VudC55OwoKICByZXR1cm4gcmVzdWx0Owp9Cgpib29sCmNpcmNsZV9pbnRlcnNlY3RzX2xpbmVf c2VnbWVudCAoCiAgICBDaXJjbGUgICAgICBjb25zdCAqY2lyYywKICAgIExpbmVTZWdtZW50IGNv bnN0ICpzZWcsCiAgICBWZWMgICAgICAgICAgICAgICAqcGlpICkKewogIFZlYyBucCA9IG5lYXJl c3RfcG9pbnRfb25fbGluZV9zZWdtZW50IChjaXJjLT5jZW50ZXIsIHNlZyk7CgogIFZlYyBjY19u cCA9IHZlY19mcm9tIChjaXJjLT5jZW50ZXIsIG5wKTsKCiAgZG91YmxlIG1jY19ucCA9IHZlY19t YWcgKGNjX25wKTsKCiAgaWYgKCBtY2NfbnAgPD0gY2lyYy0+cmFkaXVzICkgewogICAgaWYgKCBw aWkgIT0gTlVMTCApIHsKICAgICAgKnBpaSA9IG5wOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAg fQogIGVsc2UgewogICAgcmV0dXJuIGZhbHNlOwogIH0KfQoKYm9vbApjaXJjbGVfaW50ZXJzZWN0 c19yZWN0YW5nbGUgKAogICAgQ2lyY2xlICAgIGNvbnN0ICpjaXJjLAogICAgUmVjdGFuZ2xlIGNv bnN0ICpyZWN0LAogICAgVmVjICAgICAgICAgICAgICpwaWkgKQp7CiAgLy8gRklYTUU6IHRoZXNl IGFsaWFzZXMgYXJlbid0IHdvcnRoIGl0IGluIHRoaXMgZnVuY3Rpb24KICBWZWMgY2MgPSBjaXJj LT5jZW50ZXI7CiAgZG91YmxlIGNyMiA9IHBvdyAoY2lyYy0+cmFkaXVzLCAyLjApOwoKICAvLyBD aGVjayBpZiB0aGUgY2VudGVyIG9mIHRoZSBjaXJjbGUgaXMgb24gdGhlIHJlY3RhbmdsZS4gIE5v dGUgdGhhdCB0aGlzCiAgLy8gY2F0Y2hlcyB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoZSBjaXJjbGUg aXMgZW50aXJlbHkgaW5zaWRlIHRoZSByZWN0YW5nbGUuCiAgaWYgKCBwb2ludF9pbnRlcnNlY3Rz X3JlY3RhbmdsZSAoY2lyYy0+Y2VudGVyLCByZWN0KSApIHsKICAgICpwaWkgPSBjYzsKICAgIHJl dHVybiB0cnVlOwogIH0KCiAgVmVjIGNvbnN0ICpjYSA9IHJlY3QtPmNvcm5lcjsgICAvLyBDb252 ZW5pZW5jZSBhbGlhcyBmb3IgdGhlIENvcm5lciBBcnJheQoKICAvLyBDaGVjayBpZiBhbnkgb2Yg dGhlIGNvcm5lcnMgb2YgdGhlIHJlY3QgbGllIGluc2lkZSBjaXJjLiAgTm90ZSB0aGF0CiAgLy8g dGhpcyBjYXRjaGVzIHRoZSBjYXNlIHdoZXJlIHRoZSByZWN0YW5nbGUgaXMgZW50aXJlbHkgaW5z aWRlIHRoZSBjaXJjbGUuCiAgLy8gRklYTUU6IEl0IG1pZ2h0IGJlIGJldHRlciB0byB1c2UgaHlw b3QoKSwgc2luY2UgdGhhdCBmdW5jdGlvbiBzYXlzIGl0CiAgLy8gYXZvaWRzIG92ZXIvdW5kZXIt Zmxvdy4gIFRoZSBvbmUgZXh0cmEgc3FydCgpIGlzIHByb2JhYmx5IHdvcnRoIHRoYXQuCiAgLy8g QnV0IG90aGVyIG1ldGhvZHMgaW4gdGhpcyBpbnRlcmZhY2UgdXNlIHBvdygpIGFuZCBJJ20gbm90 IHN1cmUgaG93IHRvCiAgLy8gYXZvaWQgaXQsIHNvIHBlcmhhcHMgdGhlcmUncyBub3QgcmVhbGx5 IG11Y2ggcG9pbnQuCiAgLy8gRklYTUU6IGNoZWNrIHRoYXQgdGhpcyB0ZXN0IHdvcmsgcmlnaHQK ICBmb3IgKCBpbnQgaWkgPSAwIDsgaWkgPCA0IDsgaWkrKyApIHsKICAgIFZlYyB0YyA9IHsgY2Fb aWldLnggLSBjYy54LCBjYVtpaV0ueSAtIGNjLnkgfTsgICAvLyBUcmFuc2xhdGVkIENvcm5lcgog ICAgaWYgKCBwb3cgKHRjLngsIDIuMCkgKyBwb3cgKHRjLnksIDIuMCkgPD0gY3IyICkgewogICAg ICAqcGlpID0gY2FbaWldOwogICAgIHJldHVybiB0cnVlOyAKICAgIH0KICB9CiAKICAvLyBMaW5l IHNlZ21lbnRzIGJldHdlZW4gY29ybmVycyBvZiByZWN0YW5nbGUKICBMaW5lU2VnbWVudCBjMV9j MiA9IHsgY2FbMF0sIGNhWzFdIH07CiAgTGluZVNlZ21lbnQgYzJfYzMgPSB7IGNhWzFdLCBjYVsy XSB9OwogIExpbmVTZWdtZW50IGMzX2M0ID0geyBjYVsyXSwgY2FbM10gfTsKICBMaW5lU2VnbWVu dCBjNF9jMSA9IHsgY2FbM10sIGNhWzBdIH07CgogIC8vIE5vdGUgdGhhdCBwaWkgKGlmIG5vdCBO VUxMKSBpcyBjb21wdXRlZCBieSB0aGUgZmlyc3Qgc2hvcnQtY2lyY3VpdCB0cnVlCiAgLy8gcmVz dWx0IGhlcmUuCiAgcmV0dXJuICgKICAgICAgY2lyY2xlX2ludGVyc2VjdHNfbGluZV9zZWdtZW50 IChjaXJjLCAmYzFfYzIsIHBpaSkgfHwKICAgICAgY2lyY2xlX2ludGVyc2VjdHNfbGluZV9zZWdt ZW50IChjaXJjLCAmYzJfYzMsIHBpaSkgfHwKICAgICAgY2lyY2xlX2ludGVyc2VjdHNfbGluZV9z ZWdtZW50IChjaXJjLCAmYzNfYzQsIHBpaSkgfHwKICAgICAgY2lyY2xlX2ludGVyc2VjdHNfbGlu ZV9zZWdtZW50IChjaXJjLCAmYzRfYzEsIHBpaSkgKTsKfQoKYm9vbApjaXJjbGVfaW50ZXJzZWN0 c19jaXJjbGUgKAogICAgQ2lyY2xlIGNvbnN0ICpjYSwKICAgIENpcmNsZSBjb25zdCAqY2IsCiAg ICBWZWMgICAgICAgICAgKnBpaSApCnsKCiAgVmVjIGFfYiA9IHZlY19mcm9tIChjYS0+Y2VudGVy LCBjYi0+Y2VudGVyKTsgICAgICAgLy8gVmVjdG9yIGZyb20gYSB0byBiCiAgZG91YmxlIG1hX2Ig PSB2ZWNfbWFnIChhX2IpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFnbml0dWRlIG9mIGFf YgogIGRvdWJsZSBvdmVybGFwID0gY2EtPnJhZGl1cyArIGNiLT5yYWRpdXMgLSBtYV9iOyAgIC8v IE92ZXJsYXAgc2l6ZSAobGVuZ3RoKQoKICBpZiAoIG92ZXJsYXAgPj0gMC4wICkgewogICAgaWYg KCBwaWkgIT0gTlVMTCApIHsKICAgICAgaWYgICAgICAoIGNhLT5yYWRpdXMgPD0gb3ZlcmxhcCAp IHsKICAgICAgICAqcGlpID0gY2EtPmNlbnRlcjsgICAvLyBjYSBpcyBjb250YWluZWQgaW4gY2IK ICAgICAgfQogICAgICBlbHNlIGlmICggY2ItPnJhZGl1cyA8PSBvdmVybGFwICkgewogICAgICAg ICpwaWkgPSBjYi0+Y2VudGVyOyAgIC8vIGNiIGlzIGNvbnRhaW5lZCBpbiBjYQogICAgICB9CiAg ICAgIGVsc2UgewogICAgICAgICpwaWkgCiAgICAgICAgICA9IHZlY19zdW0gKAogICAgICAgICAg ICAgIGNhLT5jZW50ZXIsCiAgICAgICAgICAgICAgdmVjX3NjYWxlIChhX2IsIChjYS0+cmFkaXVz IC0gb3ZlcmxhcCAvIDIuMCkgLyBtYV9iKSApOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1 ZTsKICB9CiAgZWxzZSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKfQoKaW50CmNpcmNsZV9saW5l X3NlZ21lbnRfaW50ZXJzZWN0aW9uICgKICAgIENpcmNsZSAgICAgIGNvbnN0ICpjaXJjLAogICAg TGluZVNlZ21lbnQgY29uc3QgKnNlZywKICAgIFZlYyAgICAgICAgICAgICAgICBpbnRlcnNlY3Rp b25bMl0gKQp7CiAgLy8gVHJhbnNsYXRlZCBlbmQgcG9pbnQgY29vcmRpbmF0ZXMgc3QgY2lyYyBp cyByZWxhdGl2ZWx5IHNpdHVhdGVkIGF0ICgwLCAwKS4KICBDb29yZCB4MSA9IHNlZy0+cGEueCAt IGNpcmMtPmNlbnRlci54OwogIENvb3JkIHkxID0gc2VnLT5wYS55IC0gY2lyYy0+Y2VudGVyLnk7 CiAgQ29vcmQgeDIgPSBzZWctPnBiLnggLSBjaXJjLT5jZW50ZXIueDsKICBDb29yZCB5MiA9IHNl Zy0+cGIueSAtIGNpcmMtPmNlbnRlci55OwoKICAvLyBEZWdlbmVyYXRlIGNhc2U6IHNlZyBpcyBh IHBvaW50LgogIGlmICggeDEgPT0geDIgJiYgeTEgPT0geTIgKSB7CiAgICBpZiAoIHBvaW50X2lu dGVyc2VjdHNfY2lyY2xlIChzZWctPnBhLCBjaXJjKSApIHsKICAgICAgaWYgKCBpbnRlcnNlY3Rp b24gIT0gTlVMTCApIHsKICAgICAgICBpbnRlcnNlY3Rpb25bMF0gPSBzZWctPnBhOwogICAgICB9 CiAgICAgIHJldHVybiAxOwogICAgfQogIH0KCiAgLy8gRGVnZW5lcmF0ZSBjaXJjbGVzIGFyZW4n dCBhbGxvd2VkLgogIGFzc2VydCAoY2lyYy0+cmFkaXVzID4gMCk7CgogIC8vIFN0cmFpZ2h0IGZy b20gaHR0cDovL21hdGh3b3JsZC53b2xmcmFtLmNvbS9DaXJjbGUtTGluZUludGVyc2VjdGlvbi5o dG1sCiAgQ29vcmQgZHggPSB4MiAtIHgxOwogIENvb3JkIGR5ID0geTIgLSB5MTsKICBkb3VibGUg ZHIgPSBoeXBvdCAoZHgsIGR5KTsKICBkb3VibGUgZGV0ZXJtaW5hbnQgPSAoKGRvdWJsZSkgeDEp ICogeTIgLSAoKGRvdWJsZSkgeDIpICogeTE7CiAgZG91YmxlIGRyMiA9IHBvdyAoZHIsIDIuMCk7 CiAgZG91YmxlIGRpc2NyaW1pbmFudCA9IHBvdyAoY2lyYy0+cmFkaXVzLCAyLjApICogZHIyIC0g cG93IChkZXRlcm1pbmFudCwgMi4wKTsKICBpZiAoIGRpc2NyaW1pbmFudCA8IDAgKSB7CiAgICBy ZXR1cm4gMDsgICAvLyBXZSBhcmVuJ3QgaW50ZXJlc3RlZCBpbiBpbWFnaW5hcnkgaW50ZXJzZWN0 aW9ucwogIH0KICBkb3VibGUgc3FydF9kaXNjID0gc3FydCAoZGlzY3JpbWluYW50KTsKICBkb3Vi bGUgdGVtcCA9IChkeSA8IDAgPyAtMS4wIDogMS4wKSAqIGR4ICogc3FydF9kaXNjOwogIENvb3Jk IGlwMXggPSByb3VuZCAoKGRldGVybWluYW50ICogZHkgKyB0ZW1wKSAvIGRyMik7CiAgQ29vcmQg aXAyeCA9IHJvdW5kICgoZGV0ZXJtaW5hbnQgKiBkeSAtIHRlbXApIC8gZHIyKTsKICB0ZW1wID0g ZmFicyAoZHkpICogc3FydF9kaXNjOwogIENvb3JkIGlwMXkgPSByb3VuZCAoKC1kZXRlcm1pbmFu dCAqIGR4ICsgdGVtcCkgLyBkcjIpOwogIENvb3JkIGlwMnkgPSByb3VuZCAoKC1kZXRlcm1pbmFu dCAqIGR4IC0gdGVtcCkgLyBkcjIpOwogIAogIGludCByZXN1bHQgPSAwOwoKICAvLyBOb3cgd2Ug anVzdCBuZWVkIHRvIGNoZWNrIHdoaWNoIG9mIHRoZSBpbnRlcnNlY3Rpb25zIGFyZSBpbiBvdXIg c2VnbWVudC4KICAvLyBXZSBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIGNvb3JkaW5hdGUsIHNpbmNl IHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzIGFyZQogIC8vIGtub3duIHRvIGJlIG9uIHRoZSAoaW5m aW5pdGUpIHVuZGVybHlpbmcgZ2VvbWF0cmljYWwgbGluZS4gIEhvd2V2ZXIsCiAgLy8gYmVjYXVz ZSBpcDF4IGFuZCBpcDJ4IGFyZSB0YWludGVkIGJ5IGZsb2F0aW5nIHBvaW50IGFuZCBvdXIgbGlu ZXMgYXJlCiAgLy8gbGlrZWx5IHRvIGJlIHBhcmFsbGVsIHRvIHRoZSBheGVzLCB3ZSBtYWtlIHN1 cmUgdG8gY2hlY2sgdGhlIHdpZGVyIHNwYW4uCiAgaWYgKCBhYnMgKGR4KSA+PSBhYnMgKGR5KSAp IHsKICAgIENvb3JkIGx4ID0gKCB4MSA8IHgyID8geDEgOiB4Mik7ICAgLy8gTG93ZXIgeAogICAg Q29vcmQgaHggPSAoIHgxIDwgeDIgPyB4MiA6IHgxKTsgICAvLyBIaWdoZXIgeAogICAgaWYgKCBs eCA8PSBpcDF4ICYmIGlwMXggPD0gaHggKSB7CiAgICAgIGlmICggaW50ZXJzZWN0aW9uICE9IE5V TEwgKSB7CiAgICAgICAgaW50ZXJzZWN0aW9uW3Jlc3VsdF0KICAgICAgICAgID0gKChWZWMpIHsg aXAxeCArIGNpcmMtPmNlbnRlci54LCBpcDF5ICsgY2lyYy0+Y2VudGVyLnkgfSk7CiAgICAgIH0K ICAgICAgcmVzdWx0Kys7CiAgICB9CiAgICBpZiAoIGx4IDw9IGlwMnggJiYgaXAyeCA8PSBoeCAp IHsKICAgICAgaWYgKCBpbnRlcnNlY3Rpb24gIT0gTlVMTCApIHsKICAgICAgICBpbnRlcnNlY3Rp b25bcmVzdWx0XQogICAgICAgICAgPSAoKFZlYykgeyBpcDJ4ICsgY2lyYy0+Y2VudGVyLngsIGlw MnkgKyBjaXJjLT5jZW50ZXIueSB9KTsKICAgICAgfQogICAgICByZXN1bHQrKzsKICAgIH0KICB9 CiAgZWxzZSB7CiAgICBDb29yZCBseSA9ICggeTEgPCB5MiA/IHkxIDogeTIpOyAgIC8vIExvd2Vy IHkKICAgIENvb3JkIGh5ID0gKCB5MSA8IHkyID8geTIgOiB5MSk7ICAgLy8gSGlnaGVyIHkKICAg IGlmICggbHkgPD0gaXAxeSAmJiBpcDF5IDw9IGh5ICkgewogICAgICBpZiAoIGludGVyc2VjdGlv biAhPSBOVUxMICkgewogICAgICAgIGludGVyc2VjdGlvbltyZXN1bHRdCiAgICAgICAgICA9ICgo VmVjKSB7IGlwMXggKyBjaXJjLT5jZW50ZXIueCwgaXAxeSArIGNpcmMtPmNlbnRlci55IH0pOwog ICAgICB9CiAgICAgIHJlc3VsdCsrOwogICAgfQogICAgaWYgKCBseSA8PSBpcDJ5ICYmIGlwMnkg PD0gaHkgKSB7CiAgICAgIGlmICggaW50ZXJzZWN0aW9uICE9IE5VTEwgKSB7CiAgICAgICAgaW50 ZXJzZWN0aW9uW3Jlc3VsdF0KICAgICAgICAgID0gKChWZWMpIHsgaXAyeCArIGNpcmMtPmNlbnRl ci54LCBpcDJ5ICsgY2lyYy0+Y2VudGVyLnkgfSk7CiAgICAgIH0KICAgICAgcmVzdWx0Kys7CiAg ICB9CiAgfQogIAogIHJldHVybiByZXN1bHQ7Cn0KCnZvaWQKYXJjX2VuZF9wb2ludHMgKEFyYyAq YXJjLCBWZWMgZXBbMl0pCnsKICAvLyBTaW5lcyBhbmQgY29zaW5lcyBvZiBTdGFydCBBbmdsZS9F bmQgQW5nbGUKICBkb3VibGUKICAgIHNpbl9zYSA9IHNpbiAoYXJjLT5zdGFydF9hbmdsZSksCiAg ICBjb3Nfc2EgPSBjb3MgKGFyYy0+c3RhcnRfYW5nbGUpLAogICAgc2luX2VhID0gc2luIChhcmMt PnN0YXJ0X2FuZ2xlICsgYXJjLT5hbmdsZV9kZWx0YSksCiAgICBjb3NfZWEgPSBjb3MgKGFyYy0+ c3RhcnRfYW5nbGUgKyBhcmMtPmFuZ2xlX2RlbHRhKTsKCiAgLy8gSXQgd291bGQgYmUgbmljZXIg dG8gZG8gdGhpcyBidXQgc2luY29zKCkgY3VycmVudGx5IG5lZWRzIF9HTlVfU09VUkNFOgogIC8v ZG91YmxlIHNpbl9zYSwgY29zX3NhLCBzaW5fZWEsIGNvc19lYTsKICAvL3NpbmNvcyAoYXJjLT5z dGFydF9hbmdsZSwgJnNpbl9zYSwgJmNvc19zYSk7CiAgLy9zaW5jb3MgKGFyYy0+c3RhcnRfYW5n bGUgKyBhcmMtPmFuZ2xlX2RlbHRhLCAmc2luX2VhLCAmY29zX2VhKTsKCiAgZG91YmxlIHJhZCA9 IGFyYy0+Y2lyY2xlLnJhZGl1czsKCiAgQ29vcmQgY3ggPSBhcmMtPmNpcmNsZS5jZW50ZXIueCwg Y3kgPSBhcmMtPmNpcmNsZS5jZW50ZXIueTsKCiAgZXBbMF0gPSAoKFZlYykgeyBjeCArIHJvdW5k IChyYWQgKiBjb3Nfc2EpLCBjeSArIHJvdW5kIChyYWQgKiBzaW5fc2EpIH0pOwogIGVwWzFdID0g KChWZWMpIHsgY3ggKyByb3VuZCAocmFkICogY29zX2VhKSwgY3kgKyByb3VuZCAocmFkICogc2lu X2VhKSB9KTsKfQoKaW50CmFyY19saW5lX3NlZ21lbnRfaW50ZXJzZWN0aW9uICgKICAgIEFyYyAg ICAgICAgIGNvbnN0ICphcmMsCiAgICBMaW5lU2VnbWVudCBjb25zdCAqc2VnLAogICAgVmVjICAg ICAgICAgICAgICAgIGludGVyc2VjdGlvblsyXSApCnsKICBDaXJjbGUgY29uc3QgKnVjID0gJihh cmMtPmNpcmNsZSk7ICAgLy8gVW5kZXJseWluZyBDaXJjbGUKICAgCiAgLy8gR2V0IGludGVyc2Vj dGlvbiBjb3VudCBhbmQgaW50ZXJzZWN0aW9uIHBvaW50cyAKICBWZWMgY2lbMl07ICAgLy8gQ2ly Y2xlIEludGVyc2VjdGlvbiAodXAgdG8gdHdvIHBvaW50cykKICBpbnQgY2ljOyAgICAgLy8gQ2ly Y2xlIEludGVyc2VjdGlvbiBDb3VudAogIGNpYyA9IGNpcmNsZV9saW5lX3NlZ21lbnRfaW50ZXJz ZWN0aW9uICh1Yywgc2VnLCBjaSk7CgogIGludCByZXN1bHQgPSAwOwoKICB3aGlsZSAoIGNpYyA+ IDAgKSB7CiAgICBib29sIGlpb2EgICAvLyBJbnRlcnNlY3Rpb24gSXMgT24gQXJjCiAgICAgID0g YW5nbGVfaW5fc3BhbiAoCiAgICAgICAgICBhdGFuMiAoY2lbY2ljIC0gMV0ueSAtIHVjLT5jZW50 ZXIueSwgY2lbY2ljIC0gMV0ueCAtIHVjLT5jZW50ZXIueCksCiAgICAgICAgICBhcmMtPnN0YXJ0 X2FuZ2xlLAogICAgICAgICAgYXJjLT5hbmdsZV9kZWx0YSApOwogICAgaWYgKCBpaW9hICkgewog ICAgICBpZiAoIGludGVyc2VjdGlvbiAhPSBOVUxMICkgewogICAgICAgIGludGVyc2VjdGlvblty ZXN1bHRdID0gY2lbY2ljIC0gMV07CiAgICAgIH0KICAgICAgcmVzdWx0Kys7CiAgICB9CiAgICBj aWMtLTsKICB9CgogIHJldHVybiByZXN1bHQ7Cn0KCg== --047d7b5d9c079c58e60523aa7d49--